我创建了一个LOCAL支持票务应用程序,允许用户创建票证并提交给支持部门。每个创建的票证都会向支持部门中的所有代理广播。所以我决定使用MySQL TRIGGER - AFTER INSERT来捕获我的票证表的每张传入票证,并使用INSERT ... SELECT来填充新票证和支持部门以及代理商。
下面是我的触发器,以及它为什么不插入任何内容。我想我不会得到NEW.PK_tickets和NEW.FK_users的价值。
DELIMITER $$
USE `support`$$
DROP TRIGGER /*!50032 IF EXISTS */ `trsample`$$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `trtickets` AFTER INSERT ON `tickets`
FOR EACH ROW BEGIN
/** (start) push all notification **/
INSERT INTO `notifications`(`TRX`,`from`,`to`,`content`, `type`,`created_at`)
SELECT DISTINCT
`tickets`.`PK_tickets`, `tickets`.`FK_users`, `users_departments`.`FK_users`, `tickets`.`subject`, 'TIX', `tickets`.`created_at`
FROM `tickets`
JOIN (
SELECT `tickets_from`.`FK_tickets`,`tickets_from`.`FK_departments` FROM `tickets_from`
UNION DISTINCT
SELECT `tickets_to`.`FK_tickets`,`tickets_to`.`FK_departments` FROM `tickets_to` ) j1
ON j1.`FK_tickets` = `tickets`.`PK_tickets`
JOIN `users_departments`
ON `users_departments`.`FK_departments` = j1.`FK_departments`
WHERE `tickets`.`PK_tickets` = NEW.PK_tickets AND `users_departments`.`FK_users` <> NEW.FK_users;
/** (end) push all notification **/
END;
$$
DELIMITER ;
仔细检查我的SQL查询我使用存储过程,它运行
DELIMITER $$
USE `support`$$
DROP PROCEDURE IF EXISTS `spnottickets`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spnottickets`(IN IN_PK_tickets INT, IN IN_FK_users INT)
BEGIN
/** (start) push all notification **/
INSERT INTO `notifications`(`TRX`,`from`,`to`,`content`, `type`,`created_at`)
SELECT DISTINCT
`tickets`.`PK_tickets`, `tickets`.`FK_users`, `users_departments`.`FK_users`, `tickets`.`subject`, 'TIX', `tickets`.`created_at`
FROM `tickets`
JOIN (
SELECT `tickets_from`.`FK_tickets`,`tickets_from`.`FK_departments` FROM `tickets_from`
UNION DISTINCT
SELECT `tickets_to`.`FK_tickets`,`tickets_to`.`FK_departments` FROM `tickets_to` ) j1
ON j1.`FK_tickets` = `tickets`.`PK_tickets`
JOIN `users_departments`
ON `users_departments`.`FK_departments` = j1.`FK_departments`
WHERE `tickets`.`PK_tickets` = IN_PK_tickets AND `users_departments`.`FK_users` <> IN_FK_users;
/** (end) push all notification **/
END$$
DELIMITER ;
我们可以使用NEW.columns作为WHERE子句的一部分吗?