SQLite auto-increment non-primary key field

前端 未结 4 1144
醉话见心
醉话见心 2020-12-01 10:56

Is it possible to have a non-primary key to be auto-incremented with every insertion?

For example, I want to have a log, where every log entry has a primary key (for

相关标签:
4条回答
  • 2020-12-01 11:19

    My answer is very similar to Icarus's so I no need to mention it.

    You can use Icarus's solution in a more advanced way if needed. Below is an example of seat availiabilty table for a train reservation system.

    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)
        );
    
    0 讨论(0)
  • 2020-12-01 11:21

    You can do select max(id)+1 when you do the insertion.

    For example:

    INSERT INTO Log (id, rev_no, description) VALUES ((SELECT MAX(id) + 1 FROM log), 'rev_Id', 'some description')

    Note that this will fail on an empty table since there won't be a record with id is 0 but you can either add a first dummy entry or change the sql statement to this:

    INSERT INTO Log (id, rev_no, description) VALUES ((SELECT IFNULL(MAX(id), 0) + 1 FROM Log), 'rev_Id', 'some description')

    0 讨论(0)
  • 2020-12-01 11:22

    You could use a trigger (http://www.sqlite.org/lang_createtrigger.html) that checks the previous highest value and then increments it, or if you are doing your inserts through in a stored procedure, put that same logic in there.

    0 讨论(0)
  • 2020-12-01 11:28

    SQLite creates a unique row id (rowid) automatically. This field is usually left out when you use "select * ...", but you can fetch this id by using "select rowid,* ...". Be aware that according to the SQLite documentation, they discourage the use of autoincrement.

    create table myTable ( code text, description text );
    insert into myTable values ( 'X', 'some descr.' );
    select rowid, * from myTable;
    

    :: Result will be; 1|X|some descr.

    If you use this id as a foreign key, you can export rowid - AND import the correct value in order to keep data integrity;

    insert into myTable values( rowid, code text, description text ) values
    ( 1894, 'X', 'some descr.' );
    
    0 讨论(0)
提交回复
热议问题