插入后的MySQL触发器

时间:2013-11-23 15:50:43

标签: mysql sql triggers

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(主键,Int,自动增量)

玩家技能表:

  • id(主键,整数,自动增量)
  • globalId(Key,Int)

1 个答案:

答案 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)