Ik ken geen enkele manier om dit in één verklaring te doen, zelfs niet met een trigger.
De trigger-oplossing die @Lucky voorstelde, zou er als volgt uitzien in MySQL:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Er is echter een probleem. In de BEFORE INSERT
fase, de automatisch gegenereerde id
waarde is nog niet gegenereerd. Dus als group_id
is null, het is standaard NEW.id
wat altijd 0 is.
Maar als u deze trigger wijzigt om te worden geactiveerd tijdens de AFTER INSERT
fase, zodat u toegang heeft tot de gegenereerde waarde van NEW.id
, kunt u kolomwaarden niet wijzigen.
MySQL ondersteunt geen expressies voor de DEFAULT
van een kolom, dus u kunt dit gedrag ook niet declareren in de tabeldefinitie. *Update:MySQL 8.0.13 ondersteunt DEFAULT (<expression>)
maar de uitdrukking kan nog steeds niet afhankelijk zijn van een waarde voor automatisch verhogen (dit is gedocumenteerd
).
De enige oplossing is om de INSERT
. te doen , en doe dan onmiddellijk een UPDATE
om de group_id
te wijzigen als het niet is ingesteld.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();