MySql CREATE TRIGGER INSERT也插入了MAX PK id?

时间:2012-12-23 22:31:07

标签: mysql triggers

我正在编写名为CREATE TRIGGER的MySQL表中的第一个Item

我想插入新行INTO表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 INTO itemindustrycodeslookup SET itemindustrycodeslookupId = NULL; ..所有列都可以为null,除了自动增量的PK ID,这就是我的原因对SET itemindustrycodeslookupId = 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不想更新它自己的表...无论如何这里是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$$

1 个答案:

答案 0 :(得分: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

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