MySQL AFTER INSERT
触发器是否始终在INSERT
语句之后直接执行,或者是否可能发生2次插入并且之后发生2次触发?
我正在写这个触发器:
CREATE DEFINER=`p28004_bf4`@`localhost` TRIGGER `setId`
AFTER INSERT ON `playerkills`
FOR EACH ROW
BEGIN
INSERT INTO globals () VALUES();
UPDATE playerkills SET globalId = LAST_INSERT_ID() WHERE id = ROW.id;
END
我担心如果插入语句以某种方式进行交错会发生什么,globalId
必须始终保持一致,就像多个表中的全局唯一标识符一样。
全球表:
玩家技能表:
答案 0 :(得分:1)
最终,在这种情况下,并发命令的运行顺序并不重要。 LAST_INSERT_ID
函数非常智能,不会为您提供由其他人的并发查询插入的ID
。
作为一个相对简单的例子,我打开了两个mysql会话并使用自动增量主键创建了一个名为globals
的表,然后来回交替输入这些命令。
## Session 1 ## ## Session 2 ##
mysql> INSERT INTO globals () VALUES ();
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO globals () VALUES ();
Query OK, 1 row affected (0.00 sec)
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 2 |
+------------------+
1 row in set (0.00 sec)