2012-01-19 2 views
0

Я не могу найти официальное объяснение mysql об этом, поэтому я хочу бросить его здесь. Если у меня есть ограничения внешнего ключа между двумя таблицами в MySQL, скажем, tableA является родительской таблицей, tableB является дочерней таблицей. И, на родительской таблице A, я буду использовать «ON UPDATE CASCADE ON DELETE CASCADE», чтобы убедиться, что действия update/delete могут автоматически применяться к дочерней таблицеB MySQL.Ограничение на обновление внешнего ключа mysql в транзакции?

Теперь, мой вопрос: если обновление дочерней таблицы и родительской таблицы в транзакции или нет? Или с использованием следующих утверждений, любых различий?

Способ 1: UPDATE tableA SET col1 = "A" и col2 = "B";

Способ 2: Начать; UPDATE tableA SET col1 = "A" и col2 = "B"; Commit;

Теперь я столкнулся с проблемами в методе 1: когда tableA обновлен, tableB может занять очень много времени, чтобы обновить соответствующие столбцы (не в транзакции наверняка). Кто-нибудь сталкивался с подобными проблемами раньше?

ответ

0

Предполагая, что все ваши таблицы используют InnoDB, тогда почти все действия, выполняемые вами во время транзакции, покрываются этой транзакцией и могут быть отброшены. Somethings, как DROP TABLE делать неявные фиксации. Но для select/update/insert/delete все это охвачено.

Включает в себя любые вставки/обновления/удаления, которые инициируются каскадным отношением внешнего ключа.

+0

Да, две таблицы находятся в innoDB. Насколько я понимаю, каждое утверждение является транзакцией в InnoDB. В этом случае, почему в mehtod1 обновления для двух таблиц не являются атомарными? – WilliamLou

+0

Каскадные обновления будут частью первоначальной операции и поэтому будут атомарными. –

+0

Я не могу найти какие-либо документы MySQL об этом. И, основываясь на моих собственных экспериментах, в методе 1 обновления к двум таблицам не являются атомарными. – WilliamLou

0

say tableA является родительской таблицей, tableB является дочерней таблицей. И, на parent tableA, я буду использовать «ON UPDATE CASCADE ON DELETE CASCADE» до , чтобы убедиться, что действия update/delete могут быть применены к дочерней таблицеB на MySQL автоматически.

Если tableA имеет ON UPDATE CASCADE ON DELETE CASCADE, то tableA является «дочерним», а не «родительским». (SQL не использует термины «родительский» и «дочерний»; tableA - это , ссылающийся на таблицу, а tableB - таблица , на которую делается ссылка.) Изменения в ссылочном столбце в таблице B будут автоматически применяться для сопоставления значений в таблице A ,

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» изменился бы на «cc» в таблице B, но не в таблице A. ДБМ не может этого допустить.)

Смежные вопросы