在SQLITE中在多于1列上指定主键的语法是什么?
主键字段应声明为非null(这是非标准的,因为主键的定义是它必须是唯一的而不是null) . 但以下是任何DBMS中所有多列主键的良好实践 .
create table foo ( fooint integer not null ,foobar string not null ,fooval real ,primary key (fooint, foobar) ) ;
以下代码在SQLite中创建一个包含 2 column as a primary key 的表 .
SOLUTION:
CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))
从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.
“没有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
sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2
换句话说,您还可以创建两列主键 unique 和自动增量键 primary . 就像这样:https://stackoverflow.com/a/6157337
unique
primary
基础:
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 );
根据documentation,它是
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 值多次 .
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
PRIMARY KEY (id, name) 对我没用 . 添加约束为我完成了这项工作 .
PRIMARY KEY (id, name)
CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))
9 回答
主键字段应声明为非null(这是非标准的,因为主键的定义是它必须是唯一的而不是null) . 但以下是任何DBMS中所有多列主键的良好实践 .
以下代码在SQLite中创建一个包含 2 column as a primary key 的表 .
SOLUTION:
从SQLite的3.8.2版开始,显式NOT NULL规范的替代方案是"WITHOUT ROWID"规范:[1]
“没有ROWID”表具有潜在的效率优势,因此考虑的一个不那么冗长的替代方案是:
例如,在sqlite3提示符下:
sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2
换句话说,您还可以创建两列主键
unique
和自动增量键primary
. 就像这样:https://stackoverflow.com/a/6157337基础:
如果您的列是其他表的外键(常见情况):
根据documentation,它是
是 . 但请记住,这样的主键允许两列中的
NULL
值多次 .像这样创建一个表:
现在这没有任何警告:
PRIMARY KEY (id, name)
对我没用 . 添加约束为我完成了这项工作 .CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))