Quelle est la syntaxe pour spécifier une clé primaire sur plus d'une colonne dans SQLITE?
D'après 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 qu'une telle clé primaire autorise plusieurs fois les valeurs NULL
dans les deux colonnes.
Créer une table en tant que telle:
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
Basic:
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 courant):
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 nuls (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 de tout SGBD.
create table foo
(
fooint integer not null
,foobar string 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é. Par conséquent, une alternative moins détaillée à 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
D'une autre manière, vous pouvez également créer la clé primaire deux colonnesunique
et la clé auto-incrementprimary
. Juste comme ceci: https://stackoverflow.com/a/6157337
Le code suivant crée une table avec la colonne 2 en tant que clé primaire dans SQLite.
SOLUTION:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))