Quelle est la syntaxe pour spécifier une clé primaire sur plus d'une colonne dans SQLITE?
Quelle est la syntaxe pour spécifier une clé primaire sur plus d'une colonne dans SQLITE?
Réponses:
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)
);
NULL
est autorisé dans les clés primaires. Cette réponse souligne que si vous voulez un comportement plus standard, vous devez ajouter le NOT NULL
vous - même. Ma réponse est juste la syntaxe très basique d'une clé primaire multi-colonnes.
Oui. Mais n'oubliez pas qu'une telle clé primaire autorise NULL
plusieurs fois les valeurs dans les deux colonnes.
Créez une table comme 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
NULL
?
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 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 non nuls (ce n'est pas 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 n'importe quel 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 "SANS ROWID" ont des avantages potentiels en termes d'efficacité, donc une alternative moins verbeuse à considérer est:
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
WITHOUT ROWID
a des implications supplémentaires, et il ne devrait pas être utilisé comme alternative à l'écriture à NOT NULL
côté de votre clé primaire.
D'une autre manière, vous pouvez également créer la clé primaire à deux colonnes unique
et la clé d' incrémentation automatiqueprimary
. Tout comme ceci: https://stackoverflow.com/a/6157337
Le code suivant crée une table avec 2 colonnes comme 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))