我基本上想要使用以下方案将表从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。
答案 0 :(得分:8)
不幸的是没有这样的功能,它只在MySQL中存在AFAIK。
当我需要类似的东西时,我在插入新行时使用了以下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开始。你可以修补 用一点点来获得不同的东西。
答案 1 :(得分:-3)
不要在SQLite中自动增加主键主键吗?