圈外键引用插入MySQL和事务回滚

时间:2012-04-08 21:03:27

标签: mysql sql transactions foreign-keys innodb

我正在使用MySQL和InnoDB,最近我遇到了一些问题。

这是我正在尝试的声明(我删除了一些个人详细信息):

START TRANSACTION;

SET FOREIGN_KEY_CHECKS = 0;
INSERT INTO zdb_user (U_DateStart, U_Main_Adres_ID)
VALUES ('2012-04-08', 0);
SET FOREIGN_KEY_CHECKS = 1;

SET @newUID = LAST_INSERT_ID();

INSERT INTO zdb_adres (A_User_ID, A_Zipcode, A_Number)
VALUES (@newUID, '1234AB', 12);

UPDATE zdb_user SET U_Main_Adres_ID = LAST_INSERT_ID() WHERE User_ID = @newUID;

COMMIT;

问题是我正在使用'circle'外键引用。我现在通过禁用密钥检查来绕过它。

zdb_adres.A_User_ID需要有效的User_IDzdb_user.U_Main_Adres_ID需要有效的Adres_ID,但我没有。DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN ROLLBACK; CALL ERROR_ROLLBACK_OCCURRED; END; 。现在只要可以实际创建zdb_user中的记录,这一切都可以正常工作。但是它有一些限制因素可能会导致它无法创建。

我认为在一个错误上事务会停止,但在运行一个简单的测试后我发现这根本不是真的。因此我去google搜索,我找到了几个解决方案,如:

START TRANSACTION;

太糟糕了它不起作用,我在1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN ROLLBACK' at line 1 之后添加它时收到语法错误:

{{1}}

有人知道问题是什么吗?

1 个答案:

答案 0 :(得分:0)

摆脱禁用外键检查的唯一方法是使U_Main_Adres可以为空。