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的外键也可以吗?(两个不同的表users.id 和cars.id)。

谢谢!

4

1 回答 1

0

不知道错误消息可能会说什么或您要完成什么,但ALTER TABLE它是一个 DDL 语句,并且不能在 MySQL 中回滚。导致隐式 Commi手册章节的语句解释:

本节中列出的语句(以及它们的任何同义词) 隐式结束当前会话中活动的任何事务,就好像您在执行语句之前完成了 COMMIT 一样。从 MySQL 5.5.3 开始,大多数这些语句在执行后也会导致隐式提交;

[...]

定义或修改数​​据库对象的数据定义语言 (DDL) 语句

[...]

ALTER TABLE, CREATE TABLE,如果使用了关键字,DROP TABLE则不提交事务。TEMPORARY(这不适用于临时表上的其他操作,例如CREATE INDEX,它们确实会导致提交。)但是,虽然没有发生隐式提交,但语句也不能回滚。因此,使用此类语句会违反事务原子性:例如,如果使用CREATE TEMPORARY TABLE然后回滚事务,则表仍然存在。

于 2013-07-09T11:33:52.023 回答