Триггер вставки до / после с использованием поля автоинкремента - PullRequest
3 голосов
/ 13 мая 2011

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

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.
  • нельзя добавить дополнительное поле автоинкремента

Каково решение этой проблемы?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2018

Единственный способ получить новое значение приращения - это не причудливая форма. Я предполагал, что вы вставляете новое значение, поэтому предполагается, что это максимальный идентификатор + 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, он получит максимальный идентификатор + 1, который будет новым идентификатором.

0 голосов
/ 13 мая 2011
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

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