2013-11-23 2 views
0

Триггеры MySQL AFTER INSERT всегда выполняются непосредственно после инструкции INSERT, или возможно, что возникают 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 всегда должен быть последовательным, как глобальный уникальный идентификатор accross кратному столы.

Глобалы стол:

  • идентификатор (первичный ключ, Int, Auto Increment)

Playerkills стол:

  • идентификатор (первичный ключ, INT, автоматическое приращение)
  • globalId (Key, Int)
  • и др.

ответ

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, данные из Insert1 не будут доступны для других запросов до тех пор, пока не завершится InsertTrigger1. Я не уверен, что это справедливо для MyISAM. – Dan

+0

О'кей, это точно, что я хотел знать :) – skiwi

Смежные вопросы