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