0

既存のデータベースを MyISAM から InnoDB に変換し、さまざまな外部キーを実装していますが、データベースで変換スクリプトを実行すると問題が発生します:-

以下のようにすべてのクエリを実行しています

DELETE FROM example WHERE user NOT IN (select id FROM users);
ALTER TABLE `example` CHANGE `user` `user` INT( 11 ) UNSIGNED NOT NULL ;
ALTER TABLE example ADD FOREIGN KEY (user) REFERENCES users(ID);
ALTER TABLE example ADD FOREIGN KEY (car) REFERENCES cars(ID);

すべてのクエリを実行すると、DELETE ステートメントが実行されていないという事実のために、外部キー制約が原因で失敗します-個別に実行しても問題ありません-innodb データベースでのコミットの問題ですか、それとも次のクエリの前に削除が完了しない速度は?

IDの外部キーを2つ持っていても大丈夫ですか?(users.id と cars.id の 2 つの異なるテーブル)。

ありがとう!

4

1 に答える 1

0

エラーメッセージが何を言っているのか、何を達成しようとしているのかはわかりませんALTER TABLEが、DDL ステートメントであり、MySQL でロールバックすることはできません。暗黙のコミットを引き起こすステートメントマニュアルの章では、次のように説明しています。

このセクションにリストされているステートメント (およびそれらの同義語) は、ステートメントを実行する前に COMMIT を実行したかのように、現在のセッションでアクティブなトランザクションを暗黙的に終了します。MySQL 5.5.3 の時点で、これらのステートメントのほとんどは、実行後に暗黙的なコミットも引き起こします。

[...]

データベース オブジェクトを定義または変更するデータ定義言語 (DDL) ステートメント

[...]

ALTER TABLECREATE TABLE、およびキーワードが使用されDROP TABLEている場合、トランザクションをコミットしません。TEMPORARY(これは、コミットを引き起こす などの一時テーブルに対する他の操作には適用されませんCREATE INDEX。) ただし、暗黙的なコミットは発生しませんが、ステートメントをロールバックすることもできません。したがって、このようなステートメントを使用すると、トランザクションの原子性に違反します。たとえば、トランザクションを使用CREATE TEMPORARY TABLEしてからロールバックすると、テーブルは存在したままになります。

于 2013-07-09T11:33:52.023 に答える