sql >> Base de Datos >  >> RDS >> Mysql

Desencadenador de MySQL para actualizar un campo al valor de id

No conozco ninguna forma de hacer esto en una declaración, incluso usando un disparador.

La solución desencadenante que sugirió @Lucky se vería así en MySQL:

CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
  SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END

Sin embargo, hay un problema. En el BEFORE INSERT fase, el id generado automáticamente el valor aún no se ha generado. Entonces, si group_id es nulo, por defecto es NEW.id que siempre es 0.

Pero si cambia este disparador para que se dispare durante AFTER INSERT fase, por lo que tiene acceso al valor generado de NEW.id , no puede modificar los valores de las columnas.

MySQL no admite expresiones para DEFAULT de una columna, por lo que tampoco puede declarar este comportamiento en la definición de la tabla. *Actualización:MySQL 8.0.13 admite DEFAULT (<expression>) pero la expresión aún no puede depender de un valor de incremento automático (esto es documentado ).

La única solución es hacer INSERT , e inmediatamente haga una UPDATE para cambiar el group_id si no está configurado.

INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();