2010-07-12 2 views
5

Я работаю над созданием простой базы данных SQLite для доступа через Python. Пока у меня есть одна базовая таблица и несколько триггеров - я хочу, чтобы один триггер обновил полевой столбец «date_added» при добавлении новой записи, а другой - обновить столбец «date_updated», когда запись будет позже обновлена , Вот мой SQLite синтаксис для триггеров:sqlite UPDATE запуск триггера в операторах INSERT?

CREATE TRIGGER add_contact AFTER INSERT ON contact_info 
BEGIN 
    UPDATE contact_info SET date_added = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

CREATE TRIGGER update_contact AFTER UPDATE ON contact_info 
BEGIN 
    UPDATE contact_info SET date_updated = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

«add_contact» триггер, кажется, работает нормально ... это срабатывает, когда я добавить новую запись с помощью команды SQL INSERT, как и планировалось.

Проблема, кажется, триггер «update_contact» ... он срабатывает как при обновлении записи с помощью команды SQL UPDATE (как планируется) и когда я добавить новую запись также:

т.е. когда я добавить новую запись, я получаю это в «DATE_ADDED» и «» date_updated столбцов:

2010-07-12 05:00:06|2010-07-12 05:00:06 

и когда я обновить эту запись, она изменяется следующим образом:

2010-07-12 05:00:06|2010-07-12 05:14:26 

Думаю, я не понимаю, почему триггер UPDATE срабатывает и на INSERT?

ТИА,

Monte

Edited добавить: Есть намеки на то, как заставить его работать как задумано?

ответ

6

У вас есть ОБНОВЛЕНИЕ в триггере INSERT. Таким образом, INSERT вызывает ОБНОВЛЕНИЕ. Который вы подключили с помощью другого триггера.

+0

Огонь! Я вижу, что вы имеете в виду;) Любая идея, как достичь первоначальных целей двух отдельных триггеров, срабатывающих в INSERT, и того, который срабатывает при UPDATE? Кажется, что если бы был активирован триггер update_contact при обновлении любого поля * кроме * date_added, это должно было бы сделать это. Просто не уверен, как это сделать ... – memilanuk

+1

@memilanuk: Вы можете сравнить OLD.date_added с NEW.date_added в вашем триггере UPDATE? – Borealid

+1

Просто обновление по старой теме, так как я общался с этим кодеком сегодня. Я изменил код запуска следующим образом: UPDATE contact_info SET date_updated = DATETIME ('NOW') WHERE pkid = new.pkid И DATETIME ('NOW')! = Date_added; Кажется, что нужно работать. Спасибо за толкание в правильном направлении! – memilanuk

8

Лучшим способом избежать исходной проблемы является использование предложения для столбца date_added в определении таблицы, вместо использования триггера INSERT.

+2

И убедитесь, что инструкции * no * INSERT содержат столбец date_added. SQLite3, похоже, не выполняет предложения DEFAULT, когда NULL вставлен для данного столбца. –

Смежные вопросы