Я создал триггер, похожий на следующий:
delimiter //
CREATE TRIGGER update_total_seconds_on_phone AFTER INSERT
ON cdr
FOR EACH ROW
BEGIN
IF NEW.billsec > 0 AND NEW.userfield <> NULL THEN
UPDATE foo
SET total_seconds = total_seconds + NEW.billsec
WHERE phone_id = NEW.userfield;
END IF;
END;//
Вроде все нормально проходит. Однако, похоже, он не запускается, когда мне это нужно. Вот пример:
mysql> select total_seconds from foo where phone_id = 1;
+---------------+
| total_seconds |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec)
mysql> вставить в cdr (billsec, userfield) VALUES (60, 1); Запрос выполнен, затронута 1 строка, 12 предупреждений (0,00 сек)
mysql> select total_seconds from foo where phone_id = 1;
+---------------+
| total_seconds |
+---------------+
| 0 |
+---------------+
Обновлено: предупреждения в этом конкретном случае не влияют на триггер. В основном это дополнительные столбцы, которые не имеют значений по умолчанию в таблице cdr, которые вызывают предупреждения. Для простоты я сделал свой оператор INSERT кратким.






Сгенерировано 12 предупреждений. Кто они такие?
ETA: Ой, подождите ... вам нужно использовать is not null, а не <> null. Любое сравнение с null всегда возвращает null.
Как сказал KernelM, любое сравнение с NULL возвращает NULL. Это означает, что оба = NULL и <> NULL всегда равны NULL, что фактически неверно. Это стандартное поведение SQL.
Странно, но это сработало. Любая идея, почему в этом случае работает IS NOT NULL, а <> NULL - нет? Спасибо!