Domanda

Qual è la sintassi per specificare una chiave primaria su più di 1 colonna SQLITE?

È stato utile?

Soluzione

In base alla , è

CREATE TABLE something (
  column1, 
  column2, 
  column3, 
  PRIMARY KEY (column1, column2)
);

Altri suggerimenti

CREATE TABLE something (
  column1 INTEGER NOT NULL,
  column2 INTEGER NOT NULL,
  value,
  PRIMARY KEY ( column1, column2)
);

Sì. Ma ricordate che come chiave primaria consente valori NULL in entrambe le colonne più volte.

Crea una tabella in quanto tale:

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

Ora questo 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

di base:

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

Se le 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
);

campi chiave primaria devono essere dichiarate come non nullo (questo è non standard, come la definizione di una chiave primaria è che deve essere unico e non nullo). Ma qui di seguito è una buona pratica per tutte le chiavi primarie più colonne 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 NOT NULL espliciti è la specifica "SENZA ROWID": [ 1 ]

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

"SENZA ROWID" tabelle hanno potenziali vantaggi di efficienza, in modo da un meno prolissa alternativa da considerare è:

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

Ad esempio, al prompt sqlite3: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2

In un altro modo, si può anche fare il a due colonne chiave primaria unique e incremento automatico primary chiave. Proprio come questo: https://stackoverflow.com/a/6157337

Il codice seguente crea una tabella con colonna 2 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))

PRIMARY KEY (id, name) non ha funzionato per me. L'aggiunta di un vincolo fatto il lavoro per me.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top