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