Обратитесь к столбцу другой таблицы в триггере? - PullRequest
2 голосов
/ 11 июня 2019

Дано:

CREATE TABLE worktags (
        worktag_id      integer         not null primary key,
        worktag         character(32)   not null default '' unique,

            ...
        last_updated    character(32)   not null default '[Error]'
);
CREATE TABLE truefacts (
        about           character(32)   not null primary key,
        fact            character(32)   not null
);

Следующее:

CREATE TRIGGER zz_worktags_last_updated AFTER UPDATE ON worktags BEGIN
  UPDATE worktags SET
    last_updated = truefacts.fact WHERE truefacts.about = 'Last Worktag Update';
END;

выдает ошибку:

Ошибка: около строки 52: такого столбца нет: truefacts.fact

Но столбец существует, и синтаксическая диаграмма , кажется, указывает, что

[[schema-name . ] table-name . ] column-name

является юридическим expr для правой стороны SET column-name = expr.

1 Ответ

1 голос
/ 11 июня 2019

Вам понадобится использовать подзапрос для доступа к другой таблице (truefacts) (поскольку нигде не существует FROM truefacts), например: -

CREATE TRIGGER zz_worktags_last_updated AFTER UPDATE ON worktags BEGIN
  UPDATE worktags SET
    last_updated = (SELECT fact FROM truefacts WHERE about = 'Last Worktag Update');
END;

То естьтогда нет необходимости в TRIGGER, поскольку подзапрос может быть встроен в ОБНОВЛЕНИЕ.

например, рассмотрим следующий пример: -

DROP TRIGGER IF EXISTS zz_worktags_last_updated;
DROP TABLE IF EXISTS worktags;
DROP TABLE IF EXISTS truefacts;
CREATE TABLE worktags (
        worktag_id      integer         not null primary key,
        worktag         character(32)   not null default '' unique,
        last_updated    character(32)   not null default '[Error]'
);
CREATE TABLE truefacts (
        about           character(32)   not null primary key,
        fact            character(32)   not null
);

INSERT INTO truefacts VALUES('Last Worktag Update','xxx');
INSERT INTO worktags (worktag,last_updated) VALUES('mytag',(datetime('now')));
SELECT * FROM worktags;
UPDATE worktags SET last_updated = (SELECT fact FROM truefacts WHERE about = 'Last Worktag Update'), worktag = 'aaaa' WHERE worktag_id = 1;
SELECT * FROM worktags;

UPDATE truefacts SET fact = 'zzzz' WHERE rowid = 1;
CREATE TRIGGER zz_worktags_last_updated AFTER UPDATE ON worktags BEGIN
UPDATE worktags SET
    last_updated = (SELECT truefacts.fact FROM truefacts WHERE truefacts.about = 'Last Worktag Update');
END;

UPDATE worktags SET worktag = 'bbbb' WHERE worktag_id = 1;
SELECT * FROM worktags;

Это: -

  1. Удаляет таблицы и триггеры, если они существуют (поэтому их можно выполнить повторно)
  2. Создайте 2 таблицы и заполните их.
  3. Выбирает все из таблицы рабочих тегов (только 1 строка)

  4. Обновляет строку в таблице рабочих тегов, используя подзапрос (это пример, не требующий триггера)

  5. Выбирает все из обновленного (безтриггер) таблица рабочих тегов.
  6. Обновляет столбец фактов truefacts (чтобы показать, что триггер работает) 6.Создает триггер.
  7. Обновляет строку в таблице рабочих тегов,изменение столбца рабочей метки, оставив изменение в столбце last_updatedУмножение, которое должно быть выполнено триггером.
  8. Выбирает все из , обновляемого таблицей рабочих тегов .

Запуск приведенных выше результатов приводит к:

enter image description here

enter image description here

и, наконец,

enter image description here

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