Jag vet inte om något sätt att göra detta i ett uttalande, inte ens med en trigger.
Triggerlösningen som @Lucky föreslog skulle se ut så här i MySQL:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Det finns dock ett problem. I BEFORE INSERT
phase, det automatiskt genererade id
värde har inte genererats ännu. Så om group_id
är null, är den som standard NEW.id
som alltid är 0.
Men om du ändrar denna utlösare till att aktiveras under AFTER INSERT
fas, så att du har tillgång till det genererade värdet för NEW.id
, du kan inte ändra kolumnvärden.
MySQL stöder inte uttryck för DEFAULT
av en kolumn, så du kan inte heller deklarera detta beteende i tabelldefinitionen. *Uppdatering:MySQL 8.0.13 stöder DEFAULT (<expression>)
men uttrycket kan fortfarande inte bero på ett automatiskt ökningsvärde (detta är dokumenterad
).
Den enda lösningen är att göra INSERT
, och gör sedan omedelbart en UPDATE
för att ändra group_id
om den inte är inställd.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();