Neznám žádný způsob, jak to udělat v jednom příkazu, dokonce ani pomocí spouštěče.
Řešení spouštění, které navrhl @Lucky, by v MySQL vypadalo takto:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Nicméně je tu problém. V BEFORE INSERT fáze, automaticky vygenerované id hodnota ještě nebyla vygenerována. Pokud tedy group_id je null, výchozí je NEW.id což je vždy 0.
Pokud však toto pravidlo změníte tak, aby se spouštělo během AFTER INSERT fáze, takže máte přístup k vygenerované hodnotě NEW.id , nemůžete upravit hodnoty sloupců.
MySQL nepodporuje výrazy pro DEFAULT sloupce, takže toto chování nemůžete deklarovat ani v definici tabulky. *Aktualizace:MySQL 8.0.13 podporuje DEFAULT (<expression>) ale výraz stále nemůže záviset na hodnotě automatického přírůstku (toto je zdokumentováno
).
Jediným řešením je provést INSERT a poté okamžitě proveďte UPDATE změnit group_id pokud není nastaveno.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();