2013-11-23 146 views
0

後的MySQL AFTER INSERT觸發總是正在INSERT語句後直接執行,或者是有可能發生的2個刀片和2個觸發後發生的?MySQL的觸發器插入件

我就是寫這觸發:

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,自動增量)

Playerkills表:

  • 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) 
+0

我更擔心插入順序會發生什麼。它會像這樣:Insert1 - > InsertTrigger1 - > ... - > Insert2 - > InsertTrigger2?因爲那些可能不交錯。 – skiwi

+1

如果您使用的是InnoDB,則在InsertTrigger1完成之前,Insert1的數據將無法用於其他查詢。我不確定這是否適用於MyISAM – Dan

+0

好酷,這**完全**我想知道:) – skiwi