我正在编写名为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$$
答案 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
如果在插入的表上定义了触发器,则需要在插入后定义触发器。