【问题标题】:MySql CREATE TRIGGER INSERT also gets MAX PK id just inserted?MySql CREATE TRIGGER INSERT 也获取刚刚插入的 MAX PK id?
【发布时间】: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。无法更新存储函数/触发器中的表‘项目’,因为它已被调用此存储函数/触发器的语句使用。”

标签: mysql triggers


【解决方案1】:

在插入后调用LAST_INSERT_ID() 函数以获取刚刚插入的行的自动递增id 列的新值。即:

 INSERT INTO `itemindustrycodeslookup` values (...);
 -- no need for a select
 INSERT INTO some_child_of_itemindustrycodeslookup values (..., LAST_INSERT_ID(), ...)

如果需要再次使用,声明一个变量来存储它以供重复使用,因为插入孩子时它会改变:

DECLARE last_id int;

INSERT INTO parent ...
SET last_id = LAST_INSERT_ID();
INSERT INTO child .. -- #1
INSERT INTO child .. -- #2

如果触发器是在要插入的表上定义的,则需要定义触发器以在插入后触发。

【讨论】:

  • 类似的东西 - INSERT INTO nextcart.item (itemId, itemName, itemSku, itemPrice, itemIndustryCodesLookupId, isEnabled) VALUES (NULL) Max Extract All-Terrain Carpet Washer', 'F7452900', NULL, LAST_INSERT_ID(), NULL); ??
  • 是的!虽然我会省略 itemid 和 null ——如果你在 insert 语句中省略它,mysql 将为它创建一个 id。
  • 嗨,我以为我们有一些东西,但我在网络、StackOverflow.com 等上看到 MySQL 无法更新触发触发器的表的信息。不知道现在该做什么.. 我已经用我们目前的情况更新了我的问题。
  • 您可以通过设置NEW行的值来更改即将插入的数据,例如SET NEW.COLUMN_NAME = something;
  • 感谢您的帮助。有效的解决方案实际上是一个 BEFORE INSERT 触发器
猜你喜欢
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2011-07-31
  • 2014-08-23
  • 2011-05-20
  • 2011-07-11
  • 2011-06-17
相关资源
最近更新 更多