webentwicklung-frage-antwort-db.com.de

Sqlite-Primärschlüssel in mehreren Spalten

Wie lautet die Syntax für die Angabe eines Primärschlüssels für mehr als eine Spalte in SQLITE? 

555

Laut Dokumentation ist es

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

Ja. Beachten Sie jedoch, dass ein solcher Primärschlüssel NULL-Werte in beiden Spalten mehrfach zulässt.

Erstellen Sie eine Tabelle als solche:

    sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));

Das funktioniert jetzt 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
40
jsmarkus

Basic :

CREATE TABLE table1 (
    columnA INTEGER NOT NULL,
    columnB INTEGER NOT NULL,
    PRIMARY KEY (columnA, columnB)
);

Wenn Ihre Spalten Fremdschlüssel anderer Tabellen sind (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
);
26
compte14031879

Primärschlüsselfelder sollten als nicht null deklariert werden (dies ist kein Standard, da bei der Definition eines Primärschlüssels Eindeutig ist, dass er eindeutig und nicht null sein muss). Im Folgenden finden Sie jedoch eine bewährte Vorgehensweise für alle Mehrspalten-Primärschlüssel in einem DBMS.

create table foo
(
  fooint integer not null
  ,foobar string not null
  ,fooval real
  ,primary key (fooint, foobar)
)
;
14
Ken Reed

Seit der Version 3.8.2 von SQLite ist die Angabe "WITHOUT ROWID" eine Alternative zu den expliziten NOT NULL-Spezifikationen: [ 1 ]

NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.

"WITHOUT ROWID" -Tabellen haben potenzielle Effizienzvorteile, daher ist eine weniger ausführliche Alternative zu berücksichtigen:

CREATE TABLE t (
  c1, 
  c2, 
  c3, 
  PRIMARY KEY (c1, c2)
 ) WITHOUT ROWID;

Zum Beispiel an der sqlite3-Eingabeaufforderung: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2

8
peak

Auf andere Weise können Sie auch den zweispaltigen Primärschlüsselunique und die auto-increment -Taste primary festlegen. Einfach so: https://stackoverflow.com/a/6157337

2
ElonChan

Der folgende Code erstellt eine Tabelle mit der Spalte 2 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))
0
Naveen Kumar V

PRIMARY KEY (id, name) hat bei mir nicht funktioniert. Das Hinzufügen einer Einschränkung hat den Job für mich erledigt.

CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))

0
Choxmi