Использовать триггер для автоинкремента - PullRequest
2 голосов
/ 08 марта 2010

Я пытаюсь решить проблему, заключающуюся в том, что составные ключи в sqlite не допускают автоинкремент.

Я не знаю, возможно ли это вообще, но я пытался сохранить последний использованный идентификатор в другой таблице и использовать триггер для назначения следующего идентификатора при вставке новой записи.

Мне нужно использовать составные ключи, потому что один pk не будет уникальным (из-за слияния баз данных).

Как установить поле вставляемой строки на основе значения в другой таблице

На данный момент запрос:

CREATE TRIGGER pk BEFORE INSERT ON product_order
BEGIN
    UPDATE auto_increment SET value = value + 1 WHERE `table_name` = "product_order";
END

Это успешно обновляет значение. Но теперь мне нужно присвоить это новое значение новой записи. (New.id).

1 Ответ

6 голосов
/ 09 марта 2010

Если вы используете триггер AFTER INSERT, вы можете обновить только что вставленную строку, как в следующем примере.

CREATE TABLE auto_increment (value INT, table_name TEXT);
INSERT INTO auto_increment VALUES (0, 'product_order');

CREATE TABLE product_order (ID1 INT, ID2 INT, name TEXT);

CREATE TRIGGER pk AFTER INSERT ON product_order
BEGIN

    UPDATE  auto_increment 
    SET     value = value + 1 
    WHERE   table_name = 'product_order';

    UPDATE  product_order 
    SET     ID2 = (
                SELECT value 
                FROM auto_increment 
                WHERE table_name = 'product_order')
    WHERE   ROWID = new.ROWID;
END;

INSERT INTO product_order VALUES (1, NULL, 'a');
INSERT INTO product_order VALUES (2, NULL, 'b');
INSERT INTO product_order VALUES (3, NULL, 'c');
INSERT INTO product_order VALUES (4, NULL, 'd');

SELECT * FROM product_order;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...