Wie lautet die Syntax zum Angeben eines Primärschlüssels für mehr als eine Spalte in SQLITE?
Wie lautet die Syntax zum Angeben eines Primärschlüssels für mehr als eine Spalte in SQLITE?
Antworten:
Laut Dokumentation ist es
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
ist in Primärschlüsseln zulässig. Diese Antwort betont, dass Sie das NOT NULL
Selbst hinzufügen müssen, wenn Sie mehr Standardverhalten wünschen . Meine Antwort ist nur die grundlegende Syntax für einen mehrspaltigen Primärschlüssel.
Ja. Denken Sie jedoch daran, dass ein solcher Primärschlüssel NULL
Werte in beiden Spalten mehrmals zulässt .
Erstellen Sie eine Tabelle als solche:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Dies funktioniert nun ohne Vorwarnung:
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
?
Basic :
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
Wenn Ihre Spalten Fremdschlüssel anderer Tabellen sind (häufiger 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 als nicht null deklariert werden (dies ist kein Standard, da die Definition eines Primärschlüssels lautet, dass er eindeutig und nicht null sein muss). Im Folgenden finden Sie eine bewährte Methode für alle mehrspaltigen Primärschlüssel in einem 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 ist die Spezifikation "WITHOUT ROWID" eine Alternative zu expliziten NOT NULL-Spezifikationen: [ 1 ]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
"WITHOUT ROWID" -Tabellen bieten potenzielle Effizienzvorteile. Eine weniger ausführliche Alternative ist daher:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
Zum Beispiel an der Eingabeaufforderung sqlite3:
sqlite> insert into t values(1,null,3);
Error: NOT NULL constraint failed: t.c2
WITHOUT ROWID
hat zusätzliche Auswirkungen und sollte nicht als Alternative zum Schreiben NOT NULL
neben Ihrem Primärschlüssel verwendet werden.
Auf andere Weise können Sie auch den zweispaltigen Primärschlüssel unique
und den Auto-Inkrement- Schlüssel festlegenprimary
. Einfach so: https://stackoverflow.com/a/6157337
Der folgende Code erstellt eine Tabelle mit 2 Spalten 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))