Подтвердить что ты не робот

SQL-аут-инкремент непервичного ключевого поля

Возможно ли, чтобы непервичный ключ был автоматически добавлен с каждой вставкой?

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

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

4b9b3361

Ответ 1

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

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

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

:: Результат будет; 1 | X | некоторые descr.

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

insert into myTable values( rowid, code text, description text ) values
( 1894, 'X', 'some descr.' );

Ответ 3

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

Ответ 4

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

При необходимости вы можете использовать решение 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)
    );