Синтаксическая ошибка создания таблицы SQL при ограничении

Пытаясь создать некоторые таблицы с ограничениями, я наткнулся на синтаксические ошибки. Я использую Microsoft Access, и он постоянно сообщает мне, что мое второе ограничение неверно. Что здесь происходит? Мой код выглядит следующим образом:

CREATE TABLE STORE 
(
StoreName Char(25) NOT NULL,
City Char(35) NULL
Country Char(50) NULL,
Phone Char(8) NULL,
Fax Char(15) NULL,
Email Varchar(100) NULL,
Contact Char(35) NULL,
CONSTRAINT StorePK PRIMARY KEY(StoreName),
CONSTRAINT Citizen CHECK (Country IN ('Belize', 'United States', 'Mexico','China', 'Germany', 'France', 'Netherlands'))
);

person ANewell_GO_PACK    schedule 03.12.2015    source источник
comment
Я не знаю, поддерживает ли MS Access проверочные ограничения: msdn.microsoft .com/en-us/library/office/.   -  person Gordon Linoff    schedule 03.12.2015
comment
Возможный дубликат Возможно ли это? создать контрольное ограничение в доступе и/или DAO?   -  person Didier Aupest    schedule 03.12.2015


Ответы (2)


Я считаю, что вам нужно создать таблицу и использовать ALTER TABLE для добавления ограничения.

ALTER TABLE STORE
CONSTRAINT Citizen CHECK (
    Country IN (
        'Belize', 'United States', 'Mexico','China',
        'Germany', 'France', 'Netherlands'
    )
);

Я не знаю, насколько ситуация изменилась со времен Access 2000. Я почти уверен, что некоторые ограничения все еще применяются, как указано в этой старой документации:

Примечание. Оператор проверки ограничения может быть выполнен только через поставщика Jet OLE DB и ADO; он вернет сообщение об ошибке, если используется через пользовательский интерфейс Access SQL View.

https://msdn.microsoft.com/en-us/library/aa140015%28office.10%29.aspx#acintsql_ddlconst

person shawnt00    schedule 03.12.2015

Ваш оператор CREATE TABLE действителен для доступа к DDL при выполнении из ADO/OleDb. CHECK ограничения входят в число функций DDL, добавленных в Jet 4 и не поддерживаемых в DAO.

Это также означает, что CHECK не поддерживается по умолчанию для запросов, запускаемых из конструктора запросов. Возможно, вы сможете обойти это ограничение, задав для параметра доступа "Синтаксис, совместимый с SQL Server (ANSI 92)". Однако у этого варианта есть и другие побочные эффекты. Если вы используете его, обязательно проверьте свои существующие запросы, чтобы увидеть, все ли они по-прежнему работают должным образом.

Я поместил текст вашего оператора в переменную и успешно выполнил его следующим образом:

CurrentProject.Connection.Execute strDDL

Это сработало, потому что CurrentProject.Connection — это объект ADO.

person HansUp    schedule 03.12.2015