2009-04-09 81 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 
);