Qual è la sintassi per specificare una chiave primaria su più di 1 colonna in SQLITE?
Qual è la sintassi per specificare una chiave primaria su più di 1 colonna in SQLITE?
Risposte:
Secondo la documentazione , lo è
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
è consentito nelle chiavi primarie. Questa risposta sottolinea che se vuoi un comportamento più standard, devi aggiungere NOT NULL
te stesso. La mia risposta è solo la sintassi di base per una chiave primaria multi-colonna.
Sì. Ma ricorda che tale chiave primaria consente NULL
più volte valori in entrambe le colonne.
Crea una tabella come tale:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Ora funziona senza alcun preavviso:
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
?
Di base:
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
Se le tue colonne sono chiavi esterne di altre tabelle (caso comune):
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
);
I campi chiave primaria devono essere dichiarati come non nulli (ciò non è standard poiché la definizione di chiave primaria è che deve essere univoca e non nulla). Di seguito è una buona pratica per tutte le chiavi primarie multi-colonna in qualsiasi DBMS.
create table foo
(
fooint integer not null
,foobar string not null
,fooval real
,primary key (fooint, foobar)
)
;
Dalla versione 3.8.2 di SQLite, un'alternativa alle specifiche esplicite NOT NULL è la specifica "WITHOUT ROWID": [ 1 ]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
Le tabelle "WITHOUT ROWID" presentano potenziali vantaggi in termini di efficienza, quindi un'alternativa meno dettagliata da considerare è:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
Ad esempio, al prompt di sqlite3:
sqlite> insert into t values(1,null,3);
Error: NOT NULL constraint failed: t.c2
WITHOUT ROWID
ha implicazioni aggiuntive e non dovrebbe essere usato come alternativa alla scrittura NOT NULL
accanto alla chiave primaria.
In un altro modo, puoi anche rendere la chiave primaria a due colonne unique
e la chiave di incremento automaticoprimary
. Proprio così: https://stackoverflow.com/a/6157337
Il codice seguente crea una tabella con 2 colonne come chiave primaria in SQLite.
SOLUZIONE:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))