Jeg kender ikke til nogen måde at gøre dette på i én erklæring, selv ved at bruge en trigger.
Triggerløsningen, som @Lucky foreslog, ville se sådan ud i MySQL:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Der er dog et problem. I BEFORE INSERT
fase, det autogenererede id
værdi er ikke blevet genereret endnu. Så hvis group_id
er null, er den som standard NEW.id
som altid er 0.
Men hvis du ændrer denne udløser til udløsning under AFTER INSERT
fase, så du har adgang til den genererede værdi af NEW.id
, du kan ikke ændre kolonneværdier.
MySQL understøtter ikke udtryk for DEFAULT
af en kolonne, så du kan heller ikke erklære denne adfærd i tabeldefinitionen. *Opdatering:MySQL 8.0.13 understøtter DEFAULT (<expression>)
men udtrykket kan stadig ikke afhænge af en automatisk stigningsværdi (dette er dokumenteret
).
Den eneste løsning er at udføre INSERT
, og foretag derefter straks en UPDATE
for at ændre group_id
hvis den ikke er indstillet.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();