Не знам начин да направя това с едно изявление, дори с помощта на тригер.
Решението за задействане, което @Lucky предложи, би изглеждало така в MySQL:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Има обаче проблем. В BEFORE INSERT
фаза, автоматично генерираният id
стойността все още не е генерирана. Така че, ако group_id
е null, по подразбиране е NEW.id
което винаги е 0.
Но ако промените този тригер да се задейства по време на AFTER INSERT
фаза, така че имате достъп до генерираната стойност на NEW.id
, не можете да променяте стойностите на колоните.
MySQL не поддържа изрази за DEFAULT
на колона, така че не можете да декларирате това поведение и в дефиницията на таблицата. *Актуализация:MySQL 8.0.13 поддържа DEFAULT (<expression>)
но изразът все още не може да зависи от стойност за автоматично увеличение (това е документирано
).
Единственото решение е да направите INSERT
и след това незабавно направете UPDATE
за да промените group_id
ако не е зададено.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();