Sigueme por RSS! RSS

Trigger en MySQL : errores al actualizar

Failed to execute SQL. Error: Can\'t update table \'clientes\' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Es el error que le aparece a Ivan J. Peraza N. al intentar ejecutar el siguiente trigger:
CREATE TRIGGER combinarNombres
AFTER INSERT ON clientes
FOR EACH ROW
BEGIN
   UPDATE clientes SET nomClientes = concat(nbrClientes," ",apeClientes);
END$$
(ver cita completa)
Buenos días, le escribo desde Caracas - Venezuela y a continuación le planteo una situación que espero pueda ayudarme. Estoy desarrollando una aplicación para la tesis y tengo una tabla que tiene dos campos nbrClientes (Nombres del Cliente) y apeClientes (Apellidos del Clientes), coloque un campo adicional llamado nomCompleto que quiero sea la combinación de ambos campos, desarrollé un triggers con la intención de que este campo se llene al despues de insertar el registro, el código es el siguiente:

-- Trigger DDL Statements
DELIMITER $$

USE `s2gfra`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `s2gfra`.`combinarNombres`
AFTER INSERT ON `s2gfra`.`clientes`
FOR EACH ROW
BEGIN
UPDATE `clientes` SET `nomClientes` = concat(`nbrClientes`,\", \",`apeClientes`);
END$$

Pero cuando desde la aplicación se crea el registro me arroja el siguiente error:

Failed to execute SQL. Error: Can\'t update table \'clientes\' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Llevo un par de días intentando solucionar esta situación pero no lo he logrado. Espero que pueda darme luz para resolverlo, de antemano, muchas gracias por su tiempo.

Veamos lo que dice la documentación de MySQL:
- Las columnas de la tabla asociada con el disparador pueden referenciarse empleando los alias OLD y NEW.
- El uso de SET NEW.nombre_col = valor necesita que se tenga el privilegio UPDATE sobre la columna.

ejemplo: teniendo la siguiente tabla, crear un disarador que actualice el campo nombre_completo con el resultado de la concatenación del nombre y el apellido introducido..
CREATE TABLE clientes
(
   id_cliente INT AUTO_INCREMENT PRIMARY KEY,
   nombre VARCHAR(20) NOT NULL,
   apellido VARCHAR(20) NOT NULL,
   nombre_completo VARCHAR(42)
);

En lugar de usar la tipica sentencia UPDATE .. seteamos el campo directamente:
SET NEW.nombre_completo = CONCAT(NEW.nombre,' ',NEW.apellido);

DROP TRIGGER IF EXISTS upd_nombre_completo;
DELIMITER $$
CREATE TRIGGER upd_nombre_completo BEFORE INSERT ON clientes
FOR EACH ROW
BEGIN
   SET NEW.nombre_completo = CONCAT(NEW.nombre,' ',NEW.apellido);
END$$
DELIMITER ;

y al hacer la inserción y la consulta, obtenemos:
mysql> INSERT INTO clientes (nombre,apellido) VALUES ('Ana','Arjona');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM clientes;
+------------+--------+----------+-----------------+
| id_cliente | nombre | apellido | nombre_completo |
+------------+--------+----------+-----------------+
|          1 | Ana    | Arjona   | Ana Arjona      |
+------------+--------+----------+-----------------+
1 row in set (0.00 sec)

Lo dejo aquí para quien le pueda servir y como complemento al post triggers en MySQL.

0 comentarios: Suscribete a los comentarios por RSS

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.