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