私は 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;
問題は、「サークル」外部キー参照を使用していることです。キーチェックを無効にすることで、これを回避しました。
zdb_adres.A_User_ID
有効な が必要ですUser_ID
。zdb_user.U_Main_Adres_ID
有効な が必要ですが、Adres_ID
どちらも持っていません。これで、zdb_user のレコードが実際に作成できる限り、すべて問題なく動作します。ただし、作成されない可能性があるいくつかの制約があります。
エラーが発生するとトランザクションが停止すると思っていましたが、簡単なテストを実行した後、これはまったく真実ではないことがわかりました。したがって、私はグーグルに行き、次のようないくつかの解決策を見つけました:
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN ROLLBACK; CALL ERROR_ROLLBACK_OCCURRED; END;
残念ながら機能しません。次の後に追加すると、構文エラーが発生します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
誰が問題が何であるか知っていますか?