2012-01-19 44 views
0

私はこれについての公式のMySQLの説明を見つけることができないので、私はここにそれを投げたいです。 MySQLの2つのテーブル間に外部キー制約がある場合、tableAは親テーブル、tableBは子テーブルです。親テーブルAでは、 "UPDATE CASCADE ON DELETE CASCADE"を使用して、更新/削除のアクションをMySQLが自動的に子テーブルBに適用できるようにします。トランザクションのmysql外部キー更新制約?

私の質問は次のとおりです:子テーブルと親テーブルへの更新がトランザクション内にあるかどうか。 または次の文を使用すると、違いはありますか?

方法1: UPDATE tableA SET col1 = "A"およびcol2 = "B";

方法2: 開始。 UPDATE tableA SET col1 = "A"およびcol2 = "B"; コミットします。

ここで、method1の問題を満たしました。tableAが更新されたとき、tableBが対応する列を更新するのに非常に時間がかかることがあります(トランザクションではありません)。 誰も前に同様の問題に遭遇しましたか?

答えて

0

すべてのテーブルがInnoDBを使用していると仮定すると、トランザクション中に実行しているほとんどすべてのアクションはそのトランザクションで処理され、ロールバックできます。例:DROP TABLEのように、暗黙のコミットを行います。しかし、選択/更新/挿入/削除のために、すべてがカバーされています。

これには、外部キーカスケード関係によってトリガーされる挿入/更新/削除が含まれます。

+0

2つのテーブルは両方ともinnoDBにあります。私が理解するように、各文はInnoDBのトランザクションです。その場合、なぜmehtod1では、2つのテーブルの更新がアトミックではないのですか? – WilliamLou

+0

カスケードされた更新は初期操作の一部であるため、アトミックになります。 –

+0

これについて話しているMySQLの文書は見つかりません。そして、自分の実験に基づいて、メソッド1では、2つのテーブルの更新はアトミックではありません。 – WilliamLou

0

たとえば、tableAは親テーブル、tableBは子テーブルです。そして、 親テーブルAでは、 に "ON UPDATE CASCADE ON DELETE CASCADE"を使用して、 によって自動的に子テーブルBに更新/削除のアクションを適用できるようにします。

tableAがON UPDATE CASCADE ON DELETE CASCADEの場合、tableAは「親」ではなく「子」です。 (SQLは "parent"と "child"という用語を使用しません; tableAはテーブルを参照するです。テーブルBはテーブルを参照しています)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はそのように機能しなければなりません。更新が2つのトランザクション(参照先テーブルと参照元テーブルの2つ)であり、参照元テーブルへの更新が失敗した場合、データベースは不整合な状態になります。 (例えば、上記のアップデートでは、 'aa'はtableBでは 'cc'に変更され、tableAでは 'cc'に変更されていたので、dbmsはそうすることはできません)。

関連する問題