Não conheço nenhuma maneira de fazer isso em uma instrução, mesmo usando um gatilho.
A solução de gatilho que @Lucky sugeriu ficaria assim no MySQL:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
No entanto, há um problema. No
BEFORE INSERT
fase, o id
gerado automaticamente valor ainda não foi gerado. Então, se group_id
é nulo, o padrão é NEW.id
que é sempre 0. Mas se você alterar este gatilho para disparar durante o
AFTER INSERT
fase, então você tem acesso ao valor gerado de NEW.id
, você não pode modificar valores de coluna. O MySQL não suporta expressões para o
DEFAULT
de uma coluna, então você também não pode declarar esse comportamento na definição da tabela. *Atualização:MySQL 8.0.13 suporta DEFAULT (<expression>)
mas a expressão ainda não pode depender de um valor de incremento automático (este é documentado
). A única solução é fazer o
INSERT
, e imediatamente faça um UPDATE
para alterar o group_id
se não estiver definido. INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();