web-dev-qa-db-fra.com

Clé primaire SQLite sur plusieurs colonnes

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

555

D'après la documentation , c'est

CREATE TABLE something (
  column1, 
  column2, 
  column3, 
  PRIMARY KEY (column1, column2)
);
716
Brian Campbell
CREATE TABLE something (
  column1 INTEGER NOT NULL,
  column2 INTEGER NOT NULL,
  value,
  PRIMARY KEY ( column1, column2)
);
148
xiwok

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
40
jsmarkus

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
);
26
compte14031879

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)
)
;
14
Ken Reed

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

8
peak

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

2
ElonChan

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))
0
Naveen Kumar V