web-dev-qa-db-fra.com

Comment les déclencheurs affectent-ils Last_Insert_ID ()?

Je suis incapable de tester cela maintenant, mais je suis curieux de la réponse.

Si j'ai une gâchette sur la table A qui écrit un nouvel enregistrement au tableau B, LAST_INSERT_ID() Dites-moi le mis à jour ID pour A ou B? Je suis curieux de mysql et de PHP, mais ma compréhension est que PHP appelle simplement la mise en œuvre de MySQL.

Comment puis-je obtenir le dernier identifiant inséré pour B s'il retourne normalement A, et vice-versa?

5
Andrew

De documentation MySQL

L'effet d'une routine ou d'une gâchette stockée sur la valeur de Last_Insert_ID () observée par des déclarations suivantes dépend du type de routine:
....
[.____] Pour les fonctions stockées et les déclencheurs qui modifient la valeur, la valeur est restaurée lorsque la fonction ou la gâchette se termine, les déclarations suivantes ne voient pas une valeur modifiée. (Avant MySQL 5.0.12, la valeur n'est pas restaurée et les déclarations suivantes ont une valeur modifiée.)

Ainsi, tout ce qui se passe à l'intérieur de la gâchette [S] sur A n'affecte pas la valeur renvoyée par LAST_INSERT_ID() exécutée en dehors du corps de la gâchette. Avec le corps de la gâchette LAST_INSERT_ID Réfléchira à des inserts que vous avez faits à une autre table. Pour obtenir l'identifiant dernier pour B, vous devez stocker la valeur de LAST_INSERT_ID() quelque part (nouvelle table ou une nouvelle colonne dans A), par exemple,

delimiter /

CREATE trigger biA before insert on A
for each row

begin
 insert into B(name) values('aaa');
 set new.b_id := (select last_insert_id());
end;
/
4
a1ex07