Триггер до/после вставки с использованием поля автоматического приращения

У меня возникают проблемы с триггером вставки, который должен исправить столбец в таблице:

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, который будет новым идентификатором.