Mysql
 sql >> Database >  >> RDS >> Mysql

Trigger MySQL per aggiornare un campo al valore di id

Non conosco alcun modo per farlo in un'unica affermazione, anche usando un trigger.

La soluzione trigger suggerita da @Lucky sarebbe simile a questa in MySQL:

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

Tuttavia, c'è un problema. Nel BEFORE INSERT fase, l'id generato automaticamente il valore non è stato ancora generato. Quindi se group_id è null, per impostazione predefinita è NEW.id che è sempre 0.

Ma se modifichi questo attivatore in modo che si attivi durante il AFTER INSERT fase, quindi hai accesso al valore generato di NEW.id , non puoi modificare i valori delle colonne.

MySQL non supporta le espressioni per DEFAULT di una colonna, quindi non puoi nemmeno dichiarare questo comportamento nella definizione della tabella. *Aggiornamento:MySQL 8.0.13 supporta DEFAULT (<expression>) ma l'espressione non può ancora dipendere da un valore di incremento automatico (questo è documentato ).

L'unica soluzione è fare il INSERT , quindi esegui immediatamente un UPDATE per modificare il group_id se non è impostato.

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