2013-08-23 3 views
4

Я хотел бы обновить столбец в моей таблице с кодом страны и новым id, который является значением автоинкремента.Триггер MySQL перед вставкой обновить столбец с новым идентификатором автоинкремента

BEGIN 
SET new.key = concat(new.countryCode,new.id); 
END 

countryCode работает отлично, но id всегда пустой. Как я могу добиться чего-то подобного? Номер id исходит из столбца autoincrement.

Я знаю, что он не работает, потому что он создается после вставки. Итак, как я могу сделать что-то подобное?

+0

Почему бы просто не создать представление, возвращающее это конкатенированное значение? Нет никакой реальной необходимости хранить это. –

+0

Мне нужна ценность для использования в другом месте. Я использовал только 2 значения. Есть еще много, которые будут объединены. – Norman

ответ

4

AUTO_INCREMENT колонка только после вставка.

Если вам нужно доступ, это значение можно использовать только в AFTER INSERT триггера. Тем не менее, вы не можете изменить значение столбца в AFTER UPDATE триггере ...

Кроме того, вы не можете выполнить обновление на таблице, используемой в вашем AFTER INSERT триггера как (http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html):

В пределах хранимой функции или триггера, не разрешается изменять таблицу , которая уже используется (для чтения или записи) оператором , вызывающим функцию или триггер.


Здесь единственное разумное решение было бы создать хранимую процедуру, чтобы обновить таблицу, настраивая соответствующие столбцы в транзакции «эмулировать» вы атомный оператор вставки.


Это, как говорится, в вашем конкретном случае, то key столбец является избыточным, как столбец только конкатенация двух других столбцов в той же строке.

Учитывая его название, вы не ищете способ создания составного ключа? Что-то вроде этого:

ALTER TABLE tbl ADD UNIQUE KEY (countryCode, id); 
+0

Если я изменил его тоже после, я получаю сообщение об ошибке: '/ * SQL Error (1362): обновление новой строки не разрешено после триггера * /'. Я использую HeidiSql для этого. – Norman

+0

@Norman Насколько я знаю, нет способа добиться того, что вы пытаетесь использовать с помощью триггера. Я отредактировал свой ответ, чтобы предоставить некоторые альтернативные решения. –

+0

Я попробовал «ALTER TABLE», что вы предложили. Это ничего не делало ... – Norman

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