首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务中的mysql外键更新约束?

问事务中的mysql外键更新约束?
EN

Stack Overflow用户
提问于 2012-01-20 05:02:36
回答 2查看 2.7K关注 0票数 0

我找不到官方的mysql对此的解释,所以我想把它扔在这里。如果我在MySQL中的两个表之间有外键约束,假设tableA是父表,tableB是子表。并且,在父tableA上,我将使用"ON UPDATE CASCADE on DELETE CASCADE“来确保MySQL可以自动对子tableB应用更新/删除操作。

现在,我的问题是:对子表和父表的更新是否在事务中?或者使用下面的语句,有什么区别吗?

方法2: Begin;更新tableA SET col1="A“和col2="B";Commit;

现在,我在method1中遇到了问题:当更新tableA时,tableB可能需要很长时间来更新其相应的列(肯定不是在事务中)。以前有没有人遇到过类似的问题?

EN

回答 2

Stack Overflow用户

发布于 2012-01-20 05:05:59

假设您的所有表都在使用InnoDB,那么您在事务中执行的几乎所有操作都包含在该事务中,并且可以回滚。有些事情,比如DROP TABLE执行隐式提交。但是对于select/update/insert/delete,所有内容都包含在内。

这包括由外键级联关系触发的任何插入/更新/删除。

票数 0
EN

Stack Overflow用户

发布于 2012-01-20 07:50:51

说tableA是父表,tableB是子表。并且,在父tableA上,我将使用"ON UPDATE CASCADE on DELETE CASCADE“来确保MySQL可以自动对子tableB应用更新/删除操作。

如果tableA有ON UPDATE CASCADE ON DELETE CASCADE,那么tableA就是“子”,而不是“父”。(SQL不使用术语“父”和“子”;tableA是引用表,tableB是被引用表。)对tableB中引用的列所做的更改将自动应用于tableA中的匹配值。

代码语言:javascript
复制
create table tableB (
  column_a char(2) primary key
);

create table tableA (
  column_a char(2) not null 
    references tableB (column_a) 
    on update cascade
    on delete cascade,
  column_b char(2) not null,
  primary key (column_a, column_b)
);

insert into tableB values ('aa');
insert into tableA values ('aa', 'bb');

update tableB 
set column_a = 'cc' 
where column_a = 'aa';

select *
from tableA;

column_a   column_b
--
cc         bb

由于外键引用而级联的更新是单个事务。SQL必须以这种方式工作。如果更新是两个事务--一个用于被引用表,另一个用于引用表--并且对引用表的更新失败,则会使数据库处于不一致的状态。(例如,在上面的更新中,因为在tableB中'aa‘将更改为'cc’,但在tableA中不会。dbms不会让这种情况发生。)

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

https://stackoverflow.com/questions/8933228

复制
相关文章

相似问题

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