Sqlite clé primaire sur plusieurs colonnes

Quelle est la syntaxe pour spécifier une clé primaire sur plus d’une colonne dans SQLITE?

Selon la documentation , c’est

CREATE TABLE something ( column1, column2, column3, PRIMARY KEY (column1, column2) ); 
 CREATE TABLE something ( column1 INTEGER NOT NULL, column2 INTEGER NOT NULL, value, PRIMARY KEY ( column1, column2) ); 

Oui. Mais rappelez-vous que cette clé primaire autorise plusieurs fois les valeurs NULL dans les deux colonnes.

Créez un tableau en tant que tel:

  sqlite> CREATE TABLE something ( column1, column2, value, PRIMARY KEY (column1, column2)); 

Maintenant cela fonctionne sans aucun avertissement:

 sqlite> insert into something (value) VALUES ('bla-bla'); sqlite> insert into something (value) VALUES ('bla-bla'); sqlite> select * from something; NULL|NULL|bla-bla NULL|NULL|bla-bla 

Basique:

 CREATE TABLE table1 ( columnA INTEGER NOT NULL, columnB INTEGER NOT NULL, PRIMARY KEY (columnA, columnB) ); 

Si vos colonnes sont des clés étrangères d’autres tables (cas commun):

 CREATE TABLE table1 ( table2_id INTEGER NOT NULL, table3_id INTEGER NOT NULL, FOREIGN KEY (table2_id) REFERENCES table2(id), FOREIGN KEY (table3_id) REFERENCES table3(id), PRIMARY KEY (table2_id, table3_id) ); CREATE TABLE table2 ( id INTEGER NOT NULL, PRIMARY KEY id ); CREATE TABLE table3 ( id INTEGER NOT NULL, PRIMARY KEY id ); 

Les champs de clé primaire doivent être déclarés comme non null (ceci est non standard car la définition d’une clé primaire est qu’elle doit être unique et non nulle). Mais ci-dessous est une bonne pratique pour toutes les clés primaires multi-colonnes dans un SGBD.

 create table foo ( fooint integer not null ,foobar ssortingng not null ,fooval real ,primary key (fooint, foobar) ) ; 

Depuis la version 3.8.2 de SQLite, une alternative aux spécifications explicites NOT NULL est la spécification “WITHOUT ROWID”: [ 1 ]

 NOT NULL is enforced on every column of the PRIMARY KEY in a WITHOUT ROWID table. 

Les tables “WITHOUT ROWID” présentent des avantages potentiels en termes d’efficacité, de sorte qu’une alternative moins verbeuse à prendre en compte est la suivante:

 CREATE TABLE t ( c1, c2, c3, PRIMARY KEY (c1, c2) ) WITHOUT ROWID; 

Par exemple, à l’invite sqlite3: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2 sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2

D’une autre manière, vous pouvez également rendre la clé primaire à deux colonnes unique et la clé d’ incrémentation automatique primary . Juste comme ceci: https://stackoverflow.com/a/6157337