【问题标题】:SQLite multi-Primary Key on a Table, one of them is Auto IncrementSQLite 表上的多主键,其中之一是自动增量
【发布时间】:2011-09-03 12:38:51
【问题描述】:

我在一张表上有多个(复合)主键,其中一个是自动递增的。然而,有趣的是,SQLite 允许在强制 PRIMARY KEY 关键字之后使用 AUTOINCREMENT 关键字。

我的查询是:

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 中是允许的)。

有什么解决办法吗?

【问题讨论】:

  • 我想你的意思是说“仅”之后而不是“仅”之后?

标签: sql sqlite


【解决方案1】:

单独UNIQUE INDEXPRIMARY KEY 的效果不同。唯一索引将允许 NULL;主键约束不会。你最好声明这两个约束。

CREATE TABLE ticket (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     seat TEXT NOT NULL, 
     payment INTEGER,
     UNIQUE (id, seat));

您还应该认真考虑是否真的需要接受 NULL 付款。

【讨论】:

    【解决方案2】:

    不,我认为这是不可能的。

    您可以创建一个UNIQUE INDEX,其效果与 PRIMARY KEY 基本相同:

    CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2");
    

    此外,我看不到您的架构的逻辑,即 -> 如果列是自动递增的并且您不打算手动弄乱这些值,那么它无论如何都会是唯一的,所以它很简单短主键。为什么是复合材料?不过,您可能有充分的理由在列组合上创建另一个索引。

    【讨论】:

    • 假设我在一张表上有一个主键,我应该为这个主键生成索引还是内部生成?
    • 是的,键自动成为索引。请参阅short text 了解为什么会这样。
    • +1 表示自动增量位。事实上,如果它是自增的,它就不需要在主键中有另一个字段标记。
    • 如果您想(手动)复制数据库,那么自动增量列在数据库副本之间不一定是唯一的。如果在行中添加第二列,指示生成它的服务器的唯一 ID,则可以解决此类冲突。
    • @Michael - 我同意,我认为复合键对复制场景很有用。我记得几年前不得不用 Drupal 6 解决这样的问题。一个设计合理的解决方案可能是由 insert_id + server_id 组成的复合键。有趣,感谢您提出这个问题!
    【解决方案3】:

    令人惊讶的是,我能够使用复合键为 SqlLite 实现自动增量,其语法与 SQL Server 完全相同:

    使用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)
    }
    

    【讨论】:

      【解决方案4】:

      你也可以这样写:

      CREATE TABLE ticket (
           id INTEGER PRIMARY,
           seat TEXT, payment INTEGER,
           PRIMARY KEY (id, seat))
      

      【讨论】:

      • 不回答问题,'id' 字段不会自动递增
      猜你喜欢
      • 2012-01-21
      • 2013-04-18
      • 2015-05-11
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2010-10-21
      • 2014-02-20
      相关资源
      最近更新 更多