我的数据库中一列的默认初始值与行的自动递增ID相同。我正在尝试使用触发器进行设置。
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行的''附近使用正确的语法
我尝试了各种各样的排列,没有运气。谁能看到我做错了什么?
答案 0 :(得分:8)
正如zerkms所说,你需要改变界限。但由于您只使用1行代码,因此不需要BEGIN和END。这样,您无需更改分隔符
CREATE TRIGGER `default_order_value`
AFTER INSERT ON `clusters`
FOR EACH ROW
UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id;
由于您收到错误而无法更新行,我建议如下:
根本不要执行更新查询。默认情况下,订单值= ID值。因此,当订单值更改时,您可以正确更新它。
如果您使用php请求数据,请执行以下操作:
$order = $row['order'];
if ($order == '')
$order = $row['id'];
在您需要更新后,您已获得正确的值。
答案 1 :(得分:7)
我认为你不能那样做。 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 ;
答案 2 :(得分:2)
您收到错误是因为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 ;
答案 3 :(得分:0)
您只能在INSERT TRIGGER之前创建,其工作方式如下:
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 ;
答案 4 :(得分:-1)
这对我有用:
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