SQLite自动增加非主键字段

时间:2011-08-08 12:32:50

标签: sql sqlite auto-increment

每次插入都可以让非主键自动递增吗?

例如,我想要一个日志,其中每个日志条目都有一个主键(供内部使用)和一个修订号(我希望自动递增的INT值)。

作为一种解决方法,可以使用序列来完成,但我相信SQLite不支持序列。

4 个答案:

答案 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)
    );