表上的SQLite多主键,其中之一是自动增量

时间:2011-05-27 15:53:13

标签: sql sqlite

我在表上有多个(复合)主键,其中一个将自动递增。但是,有趣的是,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中是允许的)。

对此有何解决方案?

4 个答案:

答案 0 :(得分:23)

仅{p> UNIQUE INDEXPRIMARY 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)
}