插入后的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触发器的主要内容,如果未能解决你的问题,请参考以下文章

mysql添加触发器后无法插入数据的问题

mysql对数据库字段存储的数据加密

MySql - 可以在插入触发器之前插入 2 列吗?

插入触发器后MySQL不起作用

MySQL插入查询如果条件匹配在插入触发器之后

MySql - 触发器不起作用 - 中止插入