Tengo un disparador en el que quiero tener una variable que contiene una INT que obtengo de SELECT
, así que puedo usarlo en dos declaraciones IF en lugar de llamar al SELECT
dos veces. ¿Cómo declaras/usas variables en los disparadores de MySQL?MySQL Trigger - Almacenamiento de un SELECT en una variable
Respuesta
`CREATE TRIGGER `category_before_ins_tr` BEFORE INSERT ON `category`
FOR EACH ROW
BEGIN
**SET @tableId= (SELECT id FROM dummy LIMIT 1);**
END;`;
o simplemente puede incluir la instrucción SELECT en el SQL que está invocando el gatillo, por lo que su pasado como una de las columnas de la fila (s) de disparo. Siempre que esté seguro, devolverá infaliblemente solo una fila (de ahí un valor). (Y, por supuesto, no debe devolver un valor que interactúe con la lógica en el desencadenador, pero eso es cierto en cualquier caso).
Puede declarar variables locales en desencadenantes MySQL, con la sintaxis DECLARE
.
He aquí un ejemplo:
DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (
i SERIAL PRIMARY KEY
);
DELIMITER //
DROP TRIGGER IF EXISTS bar //
CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
DECLARE x INT;
SET x = NEW.i;
SET @a = x; -- set user variable outside trigger
END//
DELIMITER ;
SET @a = 0;
SELECT @a; -- returns 0
INSERT INTO foo() VALUES();
SELECT @a; -- returns 1, the value it got during the trigger
Cuando se asigna un valor a una variable, debe asegurarse de que la consulta devuelve un solo valor, no un conjunto de filas o un conjunto de columnas. Por ejemplo, si su consulta arroja un valor único en la práctica, está bien, pero tan pronto como devuelve más de una fila, obtiene "ERROR 1242: Subquery returns more than 1 row
".
Puede usar LIMIT
o MAX()
para asegurarse de que la variable local esté configurada en un único valor.
CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
DECLARE x INT;
SET x = (SELECT age FROM users WHERE name = 'Bill');
-- ERROR 1242 if more than one row with 'Bill'
END//
CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
DECLARE x INT;
SET x = (SELECT MAX(age) FROM users WHERE name = 'Bill');
-- OK even when more than one row with 'Bill'
END//
¿Es posible almacenar un conjunto de resultados en una variable, o tiene que emitir consultas por separado? – sunwukung
No, una variable solo puede almacenar un valor. Debe declarar un tipo de datos SQL para la variable, al igual que para una columna de una tabla.No hay ningún tipo de datos en MySQL que almacene un conjunto de resultados. –
Es una pena que el usuario no esté presente para aceptar esta respuesta, porque es la correcta. –
CREATE TRIGGER clearcamcdr AFTER INSERT ON `asteriskcdrdb`.`cdr`
FOR EACH ROW
BEGIN
SET @INC = (SELECT sip_inc FROM trunks LIMIT 1);
IF NEW.billsec >1 AND NEW.channel LIKE @INC
AND NEW.dstchannel NOT LIKE ""
THEN
insert into `asteriskcdrdb`.`filtre` (id_appel,date_appel,source,destinataire,duree,sens,commentaire,suivi)
values (NEW.id,NEW.calldate,NEW.src,NEW.dstchannel,NEW.billsec,"entrant","","");
END IF;
END$$
No intentar esto @ home
Quiero poner esta solución porque tenía dificultades para encontrar lo que necesitaba. Esta publicación me acercó lo suficiente (+1 para eso gracias), y aquí está la solución final para reorganizar los datos de columna antes de insertar si los datos coinciden con una prueba.
Nota: esto es de un proyecto legado heredé donde:
- la clave única es un compuesto de
rridprefix
+rrid
- Antes de que me hice cargo no había ninguna restricción prevenir duplicar claves únicas
- Necesitamos combinar dos tablas (una llena de duplicados) en la tabla principal que ahora tiene la restricción en la clave compuesta (por lo que la fusión falla porque la tabla ganadora no permitirá los duplicados de la tabla sucia)
on duplicate key
es menos que ideal debido a que las columnas son demasiado numerosos y pueden cambiar
De todos modos, aquí es el disparador que pone duplicados de las llaves en una columna legado tiempo que nos permite almacenar el legado, los malos datos (y no activa la combinación de tablas ganadoras, clave única).
BEGIN
-- prevent duplicate composite keys when merging in archive to main
SET @EXIST_COMPOSITE_KEY = (SELECT count(*) FROM patientrecords where rridprefix = NEW.rridprefix and rrid = NEW.rrid);
-- if the composite key to be introduced during merge exists, rearrange the data for insert
IF @EXIST_COMPOSITE_KEY > 0
THEN
-- set the incoming column data this way (if composite key exists)
-- the legacy duplicate rrid field will help us keep the bad data
SET NEW.legacyduperrid = NEW.rrid;
-- allow the following block to set the new rrid appropriately
SET NEW.rrid = null;
END IF;
-- legacy code tried set the rrid (race condition), now the db does it
SET NEW.rrid = (
SELECT if(NEW.rrid is null and NEW.legacyduperrid is null, IFNULL(MAX(rrid), 0) + 1, NEW.rrid)
FROM patientrecords
WHERE rridprefix = NEW.rridprefix
);
END
- 1. Mysql Trigger con SI ENTONCES
- 2. mysql trigger trigger almacenado ya es utilizado por instrucción que invocó trigger
- 3. ID de transacción en MySQL Trigger
- 4. Columna MySQL 'Update Timestamp' - Trigger
- 5. Salesforce Apex Trigger "isAPI" Variable de contexto
- 6. MySQL trigger + notificar a una larga conexión de Apache/PHP
- 7. ¿Cuál es la sintaxis para usar una instrucción Select dentro de un Trigger PL/SQL?
- 8. MySQL Fire Trigger para insertar y actualizar
- 9. ¿Cómo declarar una variable en MySQL?
- 10. Usando SELECT DISTINCT en MYSQL
- 11. MySQL SELECT últimos días?
- 12. MySQL select que devuelve una columna ficticia?
- 13. Cláusula LIMIT variable en MySQL
- 14. Mysql select distinct
- 15. MySQL: SELECT * FROM .... sin un campo
- 16. Almacenamiento de enteros muy grandes en MySQL
- 17. pasar una variable en un disparador
- 18. Declare una variable de tabla basada en la instrucción Select
- 19. Usando una instrucción IF en una consulta MySQL SELECT
- 20. Optimización de una consulta SELECT incrustada en mySQL
- 21. Almacenamiento de salto de línea en una variable php
- 22. ¿puedo abrir un disparador en la instrucción select en mysql?
- 23. Almacenamiento de valores múltiples en una variable $ _SESSION con PHP
- 24. Almacenamiento del resultado de expresiones regulares en una nueva variable
- 25. ¿Cómo declarar una variable en MySQL para una consulta normal?
- 26. MySQL Many-To-Many Select
- 27. MySQL instrucción Select, cláusula WHERE 'IN'
- 28. utilizar una variable de nombre de tabla en MySQL sproc
- 29. almacenamiento de cantidades de dinero en mysql
- 30. mysql select where count = 0
Lo he editado para el formateo, por lo que es posible que desee comprobar para asegurarse de que sigue siendo sintácticamente correcto. –