2013-07-09 85 views
0

我是從MyISAM數據轉換現有數據庫InnoDB和實施各種外鍵,我在與運行,雖然在我的數據庫中的轉換腳本的問題: -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的外鍵也可以嗎? (兩個不同的表users.id和cars.id)。

謝謝!

+0

'users'表的id列中的任何'NULL'值? –

回答

0

不知道錯誤消息可能會說什麼或者您想要完成什麼,但ALTER TABLE是DDL語句,不能在MySQL中回滾。該Statements That Cause an Implicit Commi手動章解釋: 隱式結束當前在當前會話的任何交易在本節(和任何同義詞爲他們)上市

的語句,因爲如果你做了執行該語句之前提交。從MySQL 5.5.3開始,大多數這些語句在執行後也會導致隱式提交;

[...]定義或修改數​​據庫

數據定義語言(DDL)語句對象

[...]

ALTER TABLECREATE TABLE ,並且DROP TABLE不承諾交易 如果使用關鍵字。 (這不適用於臨時表上的其他 操作,例如CREATE INDEX,這會導致提交 。)但是,雖然沒有發生隱式提交,但 語句也不會回滾。因此,使用此類語句將會違反事務原子性:例如,如果您使用CREATE TEMPORARY TABLE然後回滾該事務,則該表仍存在 。

+0

感謝您的回覆。錯誤(對不起,這會有所幫助!)僅僅是因爲DELETE沒有運行,所以無法設置foreignkey - 我只需要發出COMMIT;聲明之前?我試過把COMMIT;之後的個人,但它似乎仍然'跳過'DELETE FROM。我沒有使用臨時語法,所以我不知道爲什麼DELETE沒有運行(除非我自己執行它) – Jon