我在表上有多个(复合)主键,其中一个将自动递增。但是,有趣的是,SQLite允许在强制性AUTOINCREMENT
关键字之后使用PRIMARY KEY
关键字。
我的查询是:
CREATE TABLE ticket (
id INTEGER PRIMARY KEY AUTOINCREMENT,
seat TEXT, payment INTEGER,
PRIMARY KEY (id, seat))
但错误为table "ticket" has more than one primary key
。
实际上我可以避免使用此表的其他主键。但是我正在编写一个ORM框架(地狱是的,我很疯狂)并且不想更改表的PRIMARY KEY
约束生成的结构(因为它在MySQL afaik中是允许的)。
对此有何解决方案?
答案 0 :(得分:23)
UNIQUE INDEX
与PRIMARY KEY
的效果不同。唯一索引将允许NULL;主键约束不会。你最好宣布这两个限制。
CREATE TABLE ticket (
id INTEGER PRIMARY KEY AUTOINCREMENT,
seat TEXT NOT NULL,
payment INTEGER,
UNIQUE (id, seat));
您还应该认真考虑是否真的需要接受NULL付款。
答案 1 :(得分:12)
不,我不认为这是可能的。
您可以创建一个与PRIMARY KEY具有基本相同效果的UNIQUE INDEX
:
CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2");
此外,我没有看到你的架构的逻辑,即 - >如果一列是自动增量而你不想手动弄乱这些值,那么它无论如何都会是唯一的,因此它是一个很好的简单的短主键。复合材料为什么?但是,您可能有充分的理由在列组合上创建另一个索引。
答案 2 :(得分:1)
您也可以这样写:
CREATE TABLE ticket (
id INTEGER PRIMARY,
seat TEXT, payment INTEGER,
PRIMARY KEY (id, seat))
答案 3 :(得分:0)
令人惊讶的是,我能够使用与SQL Server完全相同的语法的复合键为SqLite实现自动递增:
使用 IDENTITY (1,1)
create table [dbo].[Person]
{
ID int IDENTITY (1,1) not null,
CompositeID1 int not null,
CompositeID2 int not null,
constraint [pk_person] primary key clustered (ID asc, CompositeID1 asc, CompositeID2 asc)
}