Поле не-первичного ключа автоинкремента SQLite - PullRequest
22 голосов
/ 08 августа 2011

Можно ли иметь не-первичный ключ, который будет автоматически увеличиваться при каждой вставке?

Например, я хочу иметь журнал, где у каждой записи журнала есть первичный ключ (для внутреннего использования) и номер редакции (значение INT, которое я хочу автоматически увеличивать).

В качестве обходного пути это можно сделать с помощью последовательности, но я считаю, что последовательности не поддерживаются в SQLite.

Ответы [ 4 ]

29 голосов
/ 08 августа 2011

Вы можете выбрать 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')

2 голосов
/ 17 августа 2016

SQLite автоматически создает уникальный идентификатор строки (rowid).Это поле обычно пропускается при использовании «select * ...», но вы можете получить этот идентификатор, используя «select rowid, * ...».Имейте в виду, что в соответствии с документацией SQLite, они препятствуют использованию автоинкремента.

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

:: Result будет;1 | X | некоторое описание.

Если вы используете этот идентификатор в качестве внешнего ключа, вы можете экспортировать rowid - И импортировать правильное значение, чтобы сохранить целостность данных;

insert into myTable values( rowid, code text, description text ) values
( 1894, 'X', 'some descr.' );
1 голос
/ 08 августа 2011

Вы можете использовать триггер (http://www.sqlite.org/lang_createtrigger.html), который проверяет предыдущее наибольшее значение и затем увеличивает его, или, если вы выполняете вставку в хранимой процедуре, вставьте туда ту же логику.

0 голосов
/ 09 ноября 2013

Мой ответ очень похож на ответ Икара, поэтому мне не нужно его упоминать.

При необходимости вы можете использовать решение Икара более продвинутым способом.Ниже приведен пример таблицы доступности мест для системы бронирования поездов.

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)
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...