SQLite Primärschlüssel auf mehreren Säulen
-
09-09-2019 - |
Frage
Was ist die Syntax für einen Primärschlüssel angibt, auf mehr als 1 Spalte in SQLITE?
Lösung
Nach der Dokumentation , es ist
CREATE TABLE something (
column1,
column2,
column3,
PRIMARY KEY (column1, column2)
);
Andere Tipps
CREATE TABLE something (
column1 INTEGER NOT NULL,
column2 INTEGER NOT NULL,
value,
PRIMARY KEY ( column1, column2)
);
Ja. Aber denken Sie daran, dass eine solche Primärschlüssel NULL
Werte in beiden Spalten mehrfach ermöglichen.
Erstellen Sie eine Tabelle als solche:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Jetzt funktioniert dies ohne Warnung:
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)
);
Wenn Ihre Spalten sind Fremdschlüssel von anderen Tabellen (allgemeiner Fall):
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
);
Primärschlüsselfelder sollten nicht für nichtig erklärt werden (dies nicht Standard, da die Definition ist eines Primärschlüssels ist, dass sie eindeutig und nicht null sein muss). Aber unten ist eine gute Praxis für Alle mehrspaltigen Primärschlüssel in allen DBMS.
create table foo
(
fooint integer not null
,foobar string not null
,fooval real
,primary key (fooint, foobar)
)
;
Seit Version 3.8.2 von SQLite, eine Alternative zur expliziten NOT NULL-Spezifikationen ist die "OHNE ROWID" Spezifikation: [
In einer anderen Art und Weise, können Sie auch die machen zweispaltigen Primärschlüssel unique
und die Autoinkrement Schlüssel primary
. Genau wie folgt aus: https://stackoverflow.com/a/6157337
Der folgende Code erstellt eine Tabelle mit 2 Spalte als Primärschlüssel in SQLite.
LÖSUNG:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))
PRIMARY KEY (id, name)
nicht für mich arbeiten. Hinzufügen einer Einschränkung hat der Job für mich.
CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))