【发布时间】:2012-12-24 21:05:00
【问题描述】:
我正在一个名为 Item 的 MySQL 表中编写我的第一个 CREATE TRIGGER。
我想在表itemindustrycodeslookup 中插入一个新行并取回最大itemindustrycodeslookupId 值,以便将该值插入Item 表中。
这是我目前所拥有的:
-- Trigger DDL Statements
DELIMITER $$
USE `nextcart`$$
CREATE TRIGGER `insert_itemindustrycodeslookupid`
BEFORE INSERT ON `item` FOR EACH ROW
BEGIN
INSERT INTO `itemindustrycodeslookup` SET `itemindustrycodeslookupId` = NULL;
#SELECT here..
#INSERT here...
END$$
在 INSERT 之后是否需要一个 SELECT,然后是另一个 INSERT?
另外,我不确定INSERT INTOitemindustrycodeslookupSETitemindustrycodeslookupId= NULL; .. 除了自动递增的 PK id 之外,所有列都可以为空,这就是我对SETitemindustrycodeslookupId 说的原因= NULL
**代码更新:我仍然不确定我的分隔符是否正确,我还没有准备好点击“应用”按钮,但它即将到来。
-- Trigger DDL Statements
DELIMITER $$
USE `nextcart`$$
CREATE TRIGGER `insert_itemindustrycodeslookupid`
AFTER INSERT ON `item` FOR EACH ROW
BEGIN
DECLARE fk_id int;
Set fk_id = LAST_INSERT_ID();
INSERT INTO `itemindustrycodeslookup` SET `itemindustrycodeslookupId` = NULL;
UPDATE `item` SET `item`.`itemindustrycodeslookupId` = LAST_INSERT_ID() WHERE `item`.`itemId` = fk_id;
END$$
***最新的代码更新:这确实有效,从网络上抓取。海报说“使用风险自负”,所以希望有更好的解决方案。如果 MySQL 触发了 Trigger,那么 MySQL 不喜欢更新它自己的表,所以......无论如何,这就是 DID 的工作原理。
-- Trigger DDL Statements
DELIMITER $$
USE `nextcart`$$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `nextcart`.`insert_itemindustrycodeslookupid`
BEFORE INSERT ON `nextcart`.`item`
FOR EACH ROW
BEGIN
INSERT INTO nextcart.itemindustrycodeslookup SET itemindustrycodeslookupId = NULL;
SET NEW.itemindustrycodeslookupId = (
SELECT AUTO_INCREMENT - 1
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'itemindustrycodeslookup'
);
END$$
***解决方案:发现这也有效,这可能是您在下面的答案..
-- Trigger DDL Statements
DELIMITER $$
USE `nextcart`$$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `nextcart`.`insert_itemindustrycodeslookupid`
BEFORE INSERT ON `nextcart`.`item`
FOR EACH ROW
BEGIN
INSERT INTO nextcart.itemindustrycodeslookup SET itemindustrycodeslookupId = NULL;
SET NEW.itemindustrycodeslookupId = (
SELECT LAST_INSERT_ID());
END$$
【问题讨论】:
-
不能更新触发触发器的同一个表? “错误代码:1442。无法更新存储函数/触发器中的表‘项目’,因为它已被调用此存储函数/触发器的语句使用。”