Mysql
 sql >> Base de données >  >> RDS >> Mysql

Déclencheur MySQL pour mettre à jour un champ à la valeur de id

Je ne connais aucun moyen de le faire dans une seule instruction, même en utilisant un déclencheur.

La solution de déclenchement suggérée par @Lucky ressemblerait à ceci dans MySQL :

CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
  SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END

Cependant, il y a un problème. Dans le BEFORE INSERT phase, le id généré automatiquement la valeur n'a pas encore été générée. Donc si group_id est nul, la valeur par défaut est NEW.id qui vaut toujours 0.

Mais si vous modifiez ce déclencheur pour qu'il se déclenche pendant le AFTER INSERT phase, vous avez donc accès à la valeur générée de NEW.id , vous ne pouvez pas modifier les valeurs des colonnes.

MySQL ne prend pas en charge les expressions pour le DEFAULT d'une colonne, vous ne pouvez donc pas non plus déclarer ce comportement dans la définition de table. *Mise à jour :MySQL 8.0.13 prend en charge DEFAULT (<expression>) mais l'expression ne peut toujours pas dépendre d'une valeur d'auto-incrémentation (il s'agit de documenté ).

La seule solution est de faire le INSERT , puis faites immédiatement une UPDATE pour changer le group_id s'il n'est pas défini.

INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();