У меня возникают проблемы с триггером вставки, который должен исправить столбец в таблице:
id - auto increment int
thread_id - int [NULL]
Я хочу достичь, чтобы установить thread_id
в id
, если он вставлен как NULL. Я потерпел неудачу, потому что:
- При использовании
before insert
триггер все еще не имеет нового значения для id
и загадочно устанавливает thread_id
в 0
- с помощью
after insert - update
триггер вызывает разумное исключение can't update table because it is already used by the statement
.
- вы не можете добавить дополнительное поле автоматического приращения
Каково решение этой проблемы?
Ответ 1
DELIMITER $$
CREATE TRIGGER mytrigger BEFORE INSERT ON yourtable
FOR EACH ROW BEGIN
SET NEW.thread_id = IF(ISNULL(NEW.thread_id), 0, NEW.thread_id);
END;
$$
Изменить: чтобы изменить значения текущей записи, вы не используете оператор UPDATE, вы получаете доступ к ним с помощью NEW.columname
Ответ 2
Единственный способ найти новое значение приращения - не причудливая форма. Я предположил, что вы вставляете новое значение, поэтому оно должно быть максимальным id + 1:
CREATE TRIGGER mytrigger BEFORE INSERT ON yourtable
FOR EACH ROW BEGIN
SET NEW.thread_id = IF(
ISNULL(NEW.thread_id),
(SELECT MAX(id) + 1 FROM yourtable),
NEW.thread_id);
END;
Это сработало для моего случая, если он NULL, он получит max ID + 1, который будет новым идентификатором.