每次插入都可以让非主键自动递增吗?
例如,我想要一个日志,其中每个日志条目都有一个主键(供内部使用)和一个修订号(我希望自动递增的INT值)。
作为一种解决方法,可以使用序列来完成,但我相信SQLite不支持序列。
答案 0 :(得分:29)
您可以在插入时选择max(id)+1。
例如:
INSERT INTO Log (id, rev_no, description)
VALUES ((SELECT MAX(id) + 1 FROM log), 'rev_Id', 'some description')
请注意,这将在空表上失败,因为没有id
的记录为0但您可以添加第一个虚拟条目或将sql语句更改为:
INSERT INTO Log (id, rev_no, description)
VALUES ((SELECT IFNULL(MAX(id), 0) + 1 FROM Log), 'rev_Id', 'some description')
答案 1 :(得分:2)
SQLite自动创建唯一的行ID(rowid)。当您使用“select * ...”时,通常会忽略此字段,但您可以使用“select rowid,* ...”来获取此ID。请注意,根据SQLite文档,他们不鼓励使用自动增量。
create table myTable ( code text, description text );
insert into myTable values ( 'X', 'some descr.' );
select rowid, * from myTable;
::结果将是; 1 | X | some descr。
如果您将此id用作外键,则可以导出rowid - 并导入正确的值以保持数据完整性;
insert into myTable values( rowid, code text, description text ) values
( 1894, 'X', 'some descr.' );
答案 2 :(得分:1)
您可以使用一个触发器(http://www.sqlite.org/lang_createtrigger.html)来检查先前的最高值,然后递增它,或者如果您在存储过程中进行插入,则将相同的逻辑放在那里。
答案 3 :(得分:0)
我的回答与伊卡洛斯非常相似,所以我不需要提及它。
如果需要,您可以以更高级的方式使用Icarus的解决方案。以下是火车预订系统的座位可用性表的示例。
insert into Availiability (date,trainid,stationid,coach,seatno)
values (
'11-NOV-2013',
12076,
'SRR',
1,
(select max(seatno)+1
from Availiability
where date='11-NOV-2013'
and trainid=12076
and stationid='SRR'
and coach=1)
);