2012-04-08 11 views
1

私はMySQLとInnoDBを使用していますが、最近問題が発生しました。円の外部キー参照の挿入MySQLとトランザクションのロールバック

これは私が(私はいくつかの個人情報を削除しました)を実行しようとしている文です:

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のレコードを実際に作成できる限り、これはすべて「正常」に動作します。しかし、それが作成されない原因となるいくつかの制約があります。

私はエラーが発生した場合、トランザクションは停止すると考えましたが、単純なテストを実行した後、これはまったく真実ではないことがわかりました。したがって、私はグーグルで行って、私のようないくつかの解決策が見つかりました:私はSTART TRANSACTION;後にそれを追加したとき、私は構文エラーを受信して​​います、それは動作しません

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN ROLLBACK; CALL ERROR_ROLLBACK_OCCURRED; END; 

があまりにも悪い:

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 

は誰をい問題が何であるか知っていますか?

+0

自分自身を傷つける世界を救い、循環参考文献を取り除かないのはなぜですか? address_Userテーブルは、このすべての痛みを取り除き、KISSの原則に大きな違反となるでしょう。 –

+0

どうすれば簡単にできますか?まず第一に、データの正当性を保証するものではなく、これが何であるかではない多くのものか​​ら多くのものへの可能性を紹介します。これは1対多の関係です。 – Aidiakapi

+0

循環参照を避けるためにどのようにしたらよいか質問をします。私は答えを出してうれしいです。私は今モデルのすべての基準をしていないので、私は確かにできませんが、個人的には私は今あなたがいる亀裂を避けるために自分の道を離れて行くでしょう。 –

答えて

0

外部キーチェックを無効にする唯一の方法は、U_Main_Adresをヌル可能にすることです。