首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InnoDB外键和提交

问InnoDB外键和提交
EN

Stack Overflow用户
提问于 2013-07-09 19:18:40
回答 1查看 132关注 0票数 0

我正在将现有的数据库从MyISAM转换为InnoDB并实现各种外键,但在我的数据库上运行转换脚本时遇到了问题:

我运行所有查询,如下所示

代码语言:javascript
复制
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)。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 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,然后回滚事务,则表仍然存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17546888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档