Могу ли я обновить только что добавленную строку, используя триггеры MySQL
Начальное значение по умолчанию одного столбца в моей базе данных совпадает с автоматически увеличенным идентификатором строки. Я пытаюсь использовать триггеры, чтобы установить его.
CREATE TRIGGER `default_order_value`
AFTER INSERT ON `clusters`
FOR EACH ROW
BEGIN
UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id;
END
Но это продолжает вызывать синтаксическую ошибку
#1064-у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом " в строке 5
Я перепробовал все виды перестановок этого, но безуспешно. Кто-нибудь видит, что я делаю не так?
5 ответов:
Как сказал зеркмс, вам нужно изменить делиметр. Но так как вы используете только 1 строку кода, вам не нужно начинать и заканчивать. И таким образом, вам также не нужно менять разделитель
CREATE TRIGGER `default_order_value` AFTER INSERT ON `clusters` FOR EACH ROW UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id;Поскольку вы получаете сообщение об ошибке, вы не можете обновить строку, я предлагаю следующее:
Вообще не выполняйте запрос на обновление. По умолчанию значение заказа = значение идентификатора. Поэтому, когда значение заказа изменяется, вы можете обновить его должным образом.
Если вы запрашиваете данные с помощью php, сделайте что-нибудь вроде этого:
$order = $row['order']; if ($order == '') $order = $row['id'];После того, как вам потребуется его обновить, вы получите правильное значение.
Я не думаю, что ты сможешь это сделать. Триггер
AFTER INSERTне может изменить одну и ту же таблицу, ни выдавUPDATE, ни чем-то вроде этого:CREATE TRIGGER `default_order_value` AFTER INSERT ON `clusters` FOR EACH ROW SET NEW.`order` = NEW.id ;Что приводит к этой ошибке:
> Error Code: 1362. Updating of NEW row is not allowed in after trigger
Вы также не можете использовать триггер
BEFORE INSERT, потому что тогдаNEW.idнеизвестно (если вы измените выше, столбецorderполучит значение0после вставки.
Что вы можете сделать, это использовать транзакцию:
START TRANSACTION ; INSERT INTO clusters (id) VALUES (NULL); UPDATE clusters SET `order` = id WHERE id = LAST_INSERT_ID(); COMMIT ;
Вы получаете ошибку, потому что mysql рассматривает
;в строке 5 как конец вашего объявления триггера, что, очевидно, приводит к синтаксической ошибке.Поэтому вам нужно переопределить разделитель, прежде чем указывать тело триггера:
delimiter | CREATE TRIGGER `default_order_value` AFTER INSERT ON `clusters` FOR EACH ROW BEGIN UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id; END; | delimiter ;
Вы можете создать непосредственно перед вставкой триггера, это работает следующим образом:
CREATE TRIGGER `default_order_value` BeFORE INSERT ON `clusters` FOR EACH ROW BEGIN SET NEW.`order` = NEW.id ; ENDТо же, что и ниже, мы используем
DELIMITER $$ USE `e_store`$$ DROP TRIGGER /*!50032 IF EXISTS */ `Test`$$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `Test` BEFORE INSERT ON `categories` FOR EACH ROW BEGIN DECLARE vtype VARCHAR(250) DEFAULT NULL; SET vtype = NEW.name; IF (NEW.MDNAME IS NULL) THEN -- SET NEW.MDNAME = 'NA'; SET NEW.MDNAME=MD5(NEW.name); END IF; END; $$ DELIMITER ;
Это сработало для меня:
CREATE TRIGGER `update_table_2` AFTER UPDATE ON `table_1` FOR EACH ROW UPDATE table2 JOIN table_1 SET table_2.the_column = NEW.the_column WHERE table_2.auto_increment_field = OLD.auto_increment_field
Comments