Erreur de syntaxe de table de création SQL lors de la contrainte

En essayant de créer des tables avec des contraintes, je suis tombé sur des erreurs de syntaxe. J'utilise Microsoft Access et il ne cesse de me dire que ma deuxième contrainte est fausse. Que se passe-t-il? Mon code ressemble à ceci :

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 source
comment
Je ne sais pas que MS Access prend en charge les contraintes de vérification : msdn.microsoft .com/en-us/library/office/.   -  person Gordon Linoff    schedule 03.12.2015
comment
Copie possible de Est-ce possible créer une contrainte de vérification en accès et/ou DAO ?   -  person Didier Aupest    schedule 03.12.2015


Réponses (2)


Je crois que vous devez créer la table et utiliser ALTER TABLE pour ajouter la contrainte.

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

Je ne sais pas à quel point la situation a changé depuis Access 2000. Je suis presque certain que certaines limitations s'appliquent toujours comme indiqué dans cette ancienne documentation :

Remarque L'instruction de contrainte check ne peut être exécutée que via le fournisseur Jet OLE DB et ADO ; il renverra un message d'erreur s'il est utilisé via l'interface utilisateur Access SQL View.

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

person shawnt00    schedule 03.12.2015

Votre instruction CREATE TABLE est un Access DDL valide lorsqu'elle est exécutée à partir de ADO/OleDb. Les contraintes CHECK font partie des fonctionnalités DDL ajoutées avec Jet 4 et qui ne sont pas prises en charge sous DAO.

Cela signifie également que CHECK n'est pas pris en charge par défaut pour les requêtes exécutées à partir du concepteur de requêtes. Vous pourrez peut-être contourner cette limitation en définissant l'option d'accès "Syntaxe compatible SQL Server (ANSI 92)". Toutefois, cette option a d’autres effets secondaires. Si vous l'utilisez, assurez-vous de tester vos requêtes existantes pour voir si elles fonctionnent toujours comme prévu.

J'ai mis le texte de votre instruction dans une variable et je l'ai exécuté avec succès comme ceci :

CurrentProject.Connection.Execute strDDL

Cela a fonctionné car CurrentProject.Connection est un objet ADO.

person HansUp    schedule 03.12.2015