Я не знаю ни одного способа сделать это одним оператором, даже используя триггер.
Триггерное решение, предложенное @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
равно нулю, по умолчанию используется NEW.id
, что всегда равно 0.
Но если вы измените этот триггер на срабатывание во время фазы AFTER INSERT
, чтобы у вас был доступ к сгенерированному значению NEW.id
, вы не сможете изменить значения столбца.
MySQL не поддерживает выражения для DEFAULT
столбца, поэтому вы не можете также объявить это поведение в определении таблицы.
Единственное решение - сделать 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();