我正在将现有数据库从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的外国钥匙吗? (两个不同的表users.id和cars.id)。
谢谢!
答案 0 :(得分:0)
不知道错误消息可能会说什么或者您想要完成什么,但ALTER TABLE
是一个DDL语句,而且这些语句无法在MySQL中回滚。 Statements That Cause an Implicit Commi手册章解释说:
本节中列出的陈述(以及它们的任何同义词) 隐式结束当前会话中活动的任何事务,就像在执行语句之前已完成COMMIT一样。截至MySQL 5.5.3,大多数这些语句在执行后也会导致隐式提交;
[...]
定义或修改数据库对象的数据定义语言(DDL)语句
[...]
ALTER TABLE
,CREATE TABLE
和DROP TABLE
不提交交易 如果使用TEMPORARY
关键字。 (这不适用于其他 临时表(例如CREATE INDEX
)上的操作,这些操作会导致 但是,虽然没有发生隐式提交,但是也没有 声明回滚。因此,使用这样的陈述会 违反事务原子性:例如,如果使用CREATE TEMPORARY TABLE
然后回滚事务,则表保持不变 存在。