我正在将现有的数据库从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数据库上的commit有问题还是由于delete在下一次查询之前没有完成的速度?
也可以有两个ID的外键吗?(两个不同的表users.id和cars.id)。
谢谢!
发布于 2013-07-09 19:33:52
我不知道错误消息会说什么,也不知道您想要完成什么,但是ALTER TABLE是一个DDL语句,这些语句不能在MySQL中回滚。Statements That Cause an Implicit Commi手册一章解释了:
本节中列出的语句(以及它们的任何同义词)隐式地结束当前会话中任何活动的事务,就像您在执行语句之前执行了一次提交一样。从MySQL 5.5.3开始,这些语句中的大多数也会在执行后导致隐式提交;
..。
定义或修改数据库对象的
数据定义语言(DDL)语句
..。
如果使用TEMPORARY关键字,则
ALTER TABLE、CREATE TABLE和DROP TABLE不会提交事务。(这不适用于临时表上的其他操作,如CREATE INDEX,它们确实会导致提交。)但是,尽管没有发生隐式提交,语句也不能回滚。因此,使用这样的语句将违反事务原子性:例如,如果使用CREATE TEMPORARY TABLE,然后回滚事务,则表仍然存在。
https://stackoverflow.com/questions/17546888
复制相似问题