2

CREATE TRIGGER在一个名为Item.

我想在表中插入一个新行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 INTOitemindustrycodeslookup SETitemindustrycodeslookupId = 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 触发了触发器,那么 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$$
4

1 回答 1

2

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

 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

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

于 2012-12-23T22:49:25.400 回答