插入后的MySQL触发器
Posted
技术标签:
【中文标题】插入后的MySQL触发器【英文标题】:MySQL Trigger after insert 【发布时间】:2013-11-23 15:50:42 【问题描述】: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
必须始终保持一致,就像跨多个表的全局唯一标识符一样。
全局表:
id(主键、整数、自动增量)玩家技能表:
id(主键,int,自动增量) globalId(键,整数) 等【问题讨论】:
【参考方案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)
【讨论】:
我更担心插入序列会发生什么。会不会是:Insert1 -> InsertTrigger1 -> ... -> Insert2 -> InsertTrigger2?因为它们可能不会交错。 如果您在 InnoDB 上,则在 InsertTrigger1 完成之前,其他查询将无法使用来自 Insert1 的数据。我不确定这是否适用于 MyISAM以上是关于插入后的MySQL触发器的主要内容,如果未能解决你的问题,请参考以下文章