在 MySQL 中创建触发器以生成 UUID

12

当尝试在MySQL中创建一个在插入之前生成新UUID的触发器时,为什么会出现错误?

CREATE TRIGGER insert_guid 
BEFORE INSERT ON guid_tool (FOR EACH  ROW 
BEGIN 
  SET NEW.guid_key = UUID()); 
END;

这是我的表格

create table guid_tool (
    ID INT NOT NULL AUTO_INCREMENT, 
    guid_key CHAR(40) NOT NULL, 
    PRIMARY KEY(ID)
) CHARSET=LATIN1;

我一定做错了什么。


你的错误在于你有一个额外的括号 - mabi
去掉一对括号也不起作用。 - Thunder
请提供您遇到的错误信息。您的fiddle运行正常。 - mabi
以下是错误信息:'code' ERROR 1064 (42000):您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以了解正确的语法使用方式,在第1行附近。 ERROR 1064 (42000):您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以了解正确的语法使用方式,在第1行附近。 - Thunder
尝试在触发器定义之前添加 DELIMITER /,在 END; 之后添加 /,并在其后添加 DELIMITER ;。请参见 SQLFiddle 上的演示:http://www.sqlfiddle.com/#!2/39cbd(因为 SQLFiddle 不支持 DELIMITER 命令,所以已将其注释掉)。 - krokodilko
太棒了 :) 对我有用。所以这一切都是因为分隔符。 - Thunder
2个回答

13

如@mabi在评论中提到的,你的括号有语法错误。下面的修改后的代码对我有效:

DELIMITER #
CREATE TRIGGER insert_guid 
BEFORE INSERT ON guid_tool
FOR EACH  ROW 
BEGIN 
    SET NEW.guid_key = UUID(); 
END;
#
DELIMITER ;

测试一下:

mysql> INSERT INTO guid_tool (ID) VALUES (1);
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> SELECT * FROM guid_tool;
+----+--------------------------------------+
| ID | guid_key                             |
+----+--------------------------------------+
|  1 | a0467ebf-5c4f-11e3-903a-6cccbb4423e3 |
+----+--------------------------------------+
1 row in set (0.00 sec)

7

您可以在一条语句中定义该触发器,即:

CREATE TRIGGER insert_guid BEFORE INSERT ON guid_tool FOR EACH ROW SET NEW.guid_key = UUID();
该触发器是在每次插入数据之前执行,并将一个新的全局唯一标识符(UUID)赋值给guid_key字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接