2009-04-09 79 views
522

在SQLITE中指定多於1列的主鍵的語法是什麼?多列上的Sqlite主鍵

+9

這也被稱爲複合鍵http://en.wikipedia.org/wiki/Compound_key – OneWorld 2013-01-07 16:36:52

+1

@OneWorld或複合鍵,如果任何列本身不是一個鍵。 – Michael 2014-04-09 16:47:37

回答

669

按照documentation,這是

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

嗯,這是正確的,但根據文檔,CREATE TABLE something(column1 PRIMARY KEY,column2 PRIMARY KEY);應該也可以,但事實並非如此。 – Yar 2011-03-23 18:20:38

+4

@Yar docs說:「如果在一個CREATE TABLE語句中有多個PRIMARY KEY子句,那就是錯誤。」是的,鐵路圖表可能表明它也是有效的,但下面的文字說明它不是。 – 2011-03-23 19:03:02

36

是。但請記住,這種主鍵允許在兩列中多次使用NULL值。

創建一個表作爲這樣的:

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

現在這工作沒有任何警告:

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 
144
CREATE TABLE something (
    column1 INTEGER NOT NULL, 
    column2 INTEGER NOT NULL, 
    value, 
    PRIMARY KEY (column1, column2) 
); 
13

主鍵字段應該被聲明爲NOT NULL(這是非標準的主鍵的定義 是它必須是唯一的並且不爲空)。但是對於任何DBMS中的所有多列主鍵, 以下都是一個很好的做法。

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

由於SQLite的3.8.2版本,以明確的NOT NULL規格的替代是 「WITHOUT ROWID」 規範:[1]

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

「WITHOUT ROWID」 表具有潛在的效率的優點,所以不太詳細替代要考慮的是:

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

例如,在sqlite3的提示: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2

25

基礎:

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

如果你的列是其他表的外鍵(通常情況下):

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