Как использовать предложение WITH в триггере SQLite - PullRequest
0 голосов
/ 07 июня 2018

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

Мое утверждение выглядит примерно так:

CREATE TRIGGER test7_INSERT AFTER INSERT ON test7 
BEGIN
    WITH t(t) AS (
        SELECT CAST((julianday('now') - 2440587.5)*86400000 
                    AS INTEGER)
    )
    INSERT INTO ChangeLog (t, rowid, field, value)
    VALUES 
    (t.t, 1, 'field1', new.field1),
    (t.t, 1, 'field2', new.field2),
    (t.t, 1, 'field3', new.field3);
END;

Но когда я пытаюсь выполнить этот оператор, я получаю синтаксическую ошибку рядом с "INSERT".Я переименовал другие INSERT, чтобы изолировать их от оператора INSERT внутри самого триггера.Все работает вне триггера, и когда я ознакомился с документацией SQLite по TRIGGER , я заметил, что в триггере разрешены только операторы update, insert, delete и select - очевидно, пропущено предложение WITH.

Как добиться того же эффекта, чтобы я мог повторно использовать одно и то же значение метки времени в нескольких местах в запросе?

1 Ответ

0 голосов
/ 07 июня 2018

Я бы переписал это как:

INSERT INTO ChangeLog (t, rowid, field, value)
SELECT ":1", ":2", ":3",CAST((julianday('now') - 2440587.5)*86400000  AS INTEGER)
FROM (VALUES
(t.t, 1, 'field1', new.field1),
(t.t, 1, 'field2', new.field1),
(t.t, 1, 'field3', new.field1) ) sub;

DBFiddle Demo

РЕДАКТИРОВАТЬ:

WITH cte(c1,c2,c3,c4) AS (
  VALUES  (t.t, 1, 'field1', new.field1),
          (t.t, 1, 'field2', new.field1),
          (t.t, 1, 'field3', new.field1) 
)
INSERT INTO ChangeLog (t, rowid, field, value)
SELECT c1,c2,c3, CAST((julianday('now') - 2440587.5)*86400000  AS INTEGER)
FROM cte;

DBFiddle Demo2


РЕДАКТИРОВАТЬ:

INSERT INTO ChangeLog (t, rowid, field, value)
SELECT c1,c2,c3, CAST((julianday('now') - 2440587.5)*86400000  AS INTEGER)
FROM (
    SELECT t.t AS c1, 1 AS c2, 'field1' AS c3, new.field1 AS c4 UNION ALL
    SELECT t.t AS c1, 1 AS c2, 'field2' AS c3, new.field1 AS c4 UNION ALL
    SELECT t.t AS c1, 1 AS c2, 'field3' AS c3, new.field1 AS c4;
) sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...