【发布时间】:2019-05-01 03:37:53
【问题描述】:
我需要为每个条目插入多个表,为了安全地执行此操作,我决定将整个语句设为 TRANSACTION。但是,我的代码依赖于每次 INSERT INTO 都会更新 LAST_INSERT_ID(),而且 LAST_INSERT_ID() 似乎只更新每个 TRANSACTION。因此,我需要替代典型的 START TRANSACTION;COMMIT;格式,或者我需要一个 LAST_INSERT_ID() 的替代方法,它仍然可以实现相同的目标。
person 和 yearandpage 都有自动递增的主键,这些键是 personinschoolyearbook 表中的外键。 p>
导致我提出这个问题的最初问题是我有两个带有主键的表和一个引用两者的关系表。如何通过一个数据条目同时更新所有三个?我已经研究了级联引用完整性,这会使我的外键自动更新,但我认为这不会起作用,因为我的关系表有一个必须手动插入的非外键值(状态) .
START TRANSACTION;
INSERT INTO person (firstname, middlename, lastname, maidenname)
VALUES ('Test2fname', NULL, 'Test2lname', NULL);
INSERT INTO personinschoolyearbook (personid, yearandpageid, status)
VALUES (LAST_INSERT_ID(), 0, 'Test2status'); --The zero is a placeholder, to be replaced with the primary key id that will be created in the next INSERT INTO
SELECT @personid := LAST_INSERT_ID();
INSERT INTO yearandpage (yearincluded, page, schoolid, url) --Here is where the LAST_INSERT_ID() should update but doesn't
VALUES (0000, 00, 2, 'Test2url');
UPDATE personinschoolyearbook SET yearandpageid=LAST_INSERT_ID()
WHERE personinschoolyearbook.personid = @personid;
COMMIT;
现在,LAST_INSERT_ID() 的值没有改变,而在我的关系表 personinschoolyearbook 中,应该具有取自 yearandpage 的新 id 的列改为与取自 person 的 id 相同。
【问题讨论】:
-
您确认上一年页面插入成功了吗?
-
是的,它工作正常。
-
您是否建议 LAST_INSERT_ID() 应该已更新,这意味着它与事务无关?因为我不确定是哪种情况。