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();