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