2010-04-23 21 views
150

Je peux trouver des "diagrammes" de syntaxe sur ceci sur le site Web de SQLite, mais aucun exemple et mon code ne plante. J'ai d'autres tables avec des contraintes uniques sur une seule colonne, mais je veux ajouter une contrainte à la table sur deux colonnes. C'est ce que j'ai qui cause une exception SQLiteException avec le message "erreur de syntaxe".Contrainte de table SQLite - unique sur plusieurs colonnes

CREATE TABLE name (column defs) 
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE 

Je fais cela pour les motifs suivants:

table-constraint

Pour être clair, la documentation sur le lien fourni dit que je CONTSTRAINT name devrait venir avant ma définition de la contrainte.

Quelque chose qui peut conduire à la solution est que tout ce qui suit mes définitions de colonnes entre parenthèses est ce que le débogueur se plaint.

Si je mets

...last_column_name last_col_datatype) CONSTRAINT ... 

l'erreur est près de "CONTRAINTE": erreur de syntaxe

Si je mets

...last_column_name last_col_datatype) UNIQUE ... 

l'erreur est proche "UNIQUE": syntaxe erreur

+1

UNIQUE est manquant une virgule avant qu'il commence .. – magid

Répondre

305

Mettre la déclaration unique dans la section de définition de la colonne:

CREATE TABLE name (column defs, UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE); 

travail exemple:

CREATE TABLE a (i INT, j INT, UNIQUE(i, j) ON CONFLICT REPLACE); 
+0

Wow. Je pourrais obtenir votre exemple simple pour fonctionner parfaitement. Un exemple plus complexe était le coup de pied mes fesses. Il est difficile de trouver l'excès de parenthèse quand vous en avez une douzaine. J'ai finalement réussi à travailler. Merci pour la réponse concise. – Justin

+4

Belle réponse +1. Est-ce que cette syntaxe de création me permet d'utiliser la méthode d'insertion normale, et non l'insertWithOnConflict avec l'indicateur SQLiteDatabase.CONFLICT_REPLACE? –

+1

J'utilise 'ON CONFLICT IGNORE' (je n'ai pas encore essayé de le remplacer) avec plus de 2 colonnes, mais je ne le vois pas respecter la contrainte unique, il ajoute joyeusement les doublons. – Michael

7

Eh bien, votre syntaxe ne correspond pas au lien que vous avez inclus, qui précise:

CREATE TABLE name (column defs) 
    CONSTRAINT constraint_name -- This is new 
    UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE 
+0

J'ai d'abord fait cela ... n'a pas fonctionné. Je l'ai essayé encore au cas où ... ne fonctionne toujours pas – Rich

+5

Ayman a la réponse. . . –

+1

CREATE TABLE nom (colonne defs, CONSTRAINT constraint_name - Ceci est nouveau UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE) – Afwas