Ограничение обновления внешнего ключа mysql в транзакции? - PullRequest
0 голосов
/ 20 января 2012

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

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

Метод 1: ОБНОВЛЕНИЕ таблицы A SET col1 = "A" и col2 = "B";

Метод 2: Начало;ОБНОВЛЕНИЕ таблицы A SET col1 = "A" и col2 = "B";Commit;

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

Ответы [ 2 ]

0 голосов
/ 20 января 2012

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

Если таблица A имеет ON UPDATE CASCADE ON DELETE CASCADEтогда tableA - это «потомок», а не «родитель».(SQL не использует термины «родитель» и «ребенок»; tableA - это таблица , на которую ссылается , а tableB - это таблица , на которую ссылается .)автоматически применяется к совпадающим значениям в таблице 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. DBMS не может этого допустить.)

0 голосов
/ 20 января 2012

Если все ваши таблицы используют InnoDB, то почти все действия, которые вы выполняете во время транзакции, охватываются этой транзакцией и могут быть откатаны.Что-то вроде DROP TABLE делает неявный коммит.Но для выбора / обновления / вставки / удаления все это покрыто.

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

...