我找不到关于此的官方mysql解释,所以我想把它扔到这里。 如果我在MySQL中的两个表之间有外键约束,比如tableA是父表,tableB是子表。并且,在父表A上,我将使用“ON UPDATE CASCADE ON DELETE CASCADE”来确保MySQL自动将更新/删除操作应用于子表B.
现在,我的问题是:如果对子表和父表的更新是否在事务中? 或者通过使用以下陈述,任何差异?
方法1: 更新表A SET col1 =“A”和col2 =“B”;
方法2: 开始; UPDATE tableA SET col1 =“A”,col2 =“B”; 提交;
现在,我遇到了method1中的问题:当tableA更新时,tableB可能需要很长时间来更新其相应的列(当然不是在事务中)。 有人遇到过类似的问题吗?
答案 0 :(得分:0)
假设您的所有表都使用InnoDB,那么您在事务中执行的几乎所有操作都将被该事务覆盖并可以回滚。像DROP TABLE
这样的事情做了隐式提交。但是对于select / update / insert / delete,它都被覆盖了。
包括由外键级联关系触发的任何插入/更新/删除。
答案 1 :(得分:0)
说tableA是父表,tableB是子表。而且,在 父表A,我将使用“ON UPDATE CASCADE ON DELETE CASCADE”来 确保更新/删除操作可以应用于子tableB MySQL自动。
如果tableA有ON UPDATE CASCADE ON DELETE CASCADE
,则tableA是“child”,而不是“parent”。 (SQL不使用术语“父”和“子”; tableA是引用表,tableB是引用的表。)对引用列的更改tableB将自动应用于tableA中的匹配值。
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必须以这种方式工作。如果更新是两个事务 - 一个用于引用表,另一个用于引用表 - 并且对引用表的更新失败,则会使数据库处于不一致状态。 (例如,在上面的更新中,因为'aa'在tableB中会更改为'cc',但不会在tableA中更改.dbms不能让这种情况发生。)