sqlite:具有自动递增列的多列主键

Posted

技术标签:

【中文标题】sqlite:具有自动递增列的多列主键【英文标题】:sqlite: multi-column primary key with an auto increment column 【发布时间】:2011-03-18 10:08:08 【问题描述】:

我基本上想使用以下方案将表从 mysql 转换为 sqlite:

create table items (
id integer auto_increment,
version integer default 0,
primary key (id, version)
);

本质上,我希望 ID 在我向表中插入任何内容时自动递增,VERSION 从 0 开始,但只要 VERSION 不同,仍然允许多个具有相同 ID 的项目。

我正在尝试使用 Sqlite 复制这种行为,但是我似乎无法让表创建工作。似乎您只允许将一列作为自动增量,并且它必须是主键。如果我将 ID 作为主键,那么我不能使用 VERSION 作为键的一部分。但是,如果我创建一个多列键 (ID, VERSION) ,那么我无法让 ID 自动递增。

是否有解决方法或更好的方法来设计我的桌子?


我正在考虑以下解决方案:

表 1:

create table items 
id integer primary autoincrement,
version integer

表 2:

create table item_version 
id integer,
version integer,
primary key (id, version)

当我添加一个新项目时,我将它添加到项目中并让 ID 自动递增。但是,如果我有相同 id 的新版本,我会将其添加到 item_version。基本上,我使用 item_version 来保存除项目之外的所有内容,以生成唯一的 ID。

【问题讨论】:

【参考方案1】:

不幸的是没有这样的功能,它只存在于 MySQL 中。

当我需要类似的东西时,我只是在插入新行时使用以下 SQL:

INSERT INTO items(id,version) 
SELECT new_id,SELECT COALESCE(MAX(version),0)+1 FROM items WHERE id=new_id)

这对我有用。

您还可以创建一个可以正确更新版本的触发器:

create trigger my_increment
after insert 
on items 
begin 
    update items 
    set version=(select max(version) from items where id=new.id)+1 
    where id=new.id and version = 0;
end;

现在,每次你在表中插入一个新值:

> insert into items(id) values(10);
> insert into items(id) values(15);
> insert into items(id) values(10);
> select * from items;
10|1
15|1
10|2

如您所见,它为新插入的 id 创建版本。从1开始。你可以修补 为了得到不同的东西。

【讨论】:

当您插入具有相同 id 的新行时,此 sql 似乎会增加版本。我的问题是我什至无法弄清楚如何设置表以允许这样做,因为我必须在自动递增的单列主键或不自动递增的多列主键之间进行选择。【参考方案2】:

在 SQLlite 中整数主键不会自动递增吗?

【讨论】:

如果您指定,他们可以。以CREATE TABLE MyTable (Col1 INTEGER PRIMARY KEY AUTOINCREMENT) 为例 在这种情况下,如果您有多个主键,则不会。

以上是关于sqlite:具有自动递增列的多列主键的主要内容,如果未能解决你的问题,请参考以下文章

使用 System.Data.Linq.Mapping 和自动递增 sqlite 数据库中的主键时出错

如果一个表是自动增量的,你怎么能从一个 sqlite 表的元数据中得到?

如何使用 EF 核心在 SQLite 中创建自动增量列?

如何使用 EF 核心在 SQLite 中创建自动增量列?

如何用 sqlite 加入这四个表

SQLITE 和自动索引