2

私は MYSQL 5.1.38 を使用しており、次のテーブルがあります。

create table table1 (  
col1 varchar(50) primary key not null,  
ts1 timestamp not null default current_timestamp on update current_timestamp  
)engine=innodb;  

create table table2 (
col1 varchar(50) not null,
ts2 timestamp not null default current_timestamp on update current_timestamp,  
foreign key (col1) references table1 (col1) on update cascade on delete cascade  
)engine=innodb;  

table1 の col1 を更新すると、table1 の ts1 と table2 の col1 は更新されますが、table2 の ts2 は更新されません。

出力は次のとおりです。

mysql> table1 (col1) 値 ('test') に挿入します。
クエリ OK、影響を受ける 1 行 (0.00 秒)

mysql> table2 (col1) 値 ('test') に挿入します。
クエリ OK、影響を受ける 1 行 (0.00 秒)

mysql> テーブル 1 から * を選択します。
+------+---------------------+
| | 列1 | ts1 |
+------+---------------------+
| | テスト | 2013-05-17 09:37:56 |
+------+---------------------+
セットで 1 行 (0.00 秒)

mysql> テーブル 2 から * を選択します。
+------+---------------------+
| | 列1 | ts2 |
+------+---------------------+
| | テスト | 2013-05-17 09:38:03 |
+------+---------------------+
セットで 1 行 (0.01 秒)

mysql> update table1 set col1='test1' where col1 = 'test';
クエリ OK、影響を受ける 1 行 (0.00 秒)
一致した行: 1 変更された: 1 警告: 0

mysql> テーブル 1 から * を選択します。
+--------------------+---------------------+
| | 列1 | ts1 |
+--------------------+---------------------+
| | テスト1 | 2013-05-17 09:44:28 |
+--------------------+---------------------+
セットで 1 行 (0.00 秒)

mysql> テーブル 2 から * を選択します。
+--------------------+---------------------+
| | 列1 | ts2 |
+--------------------+---------------------+
| | テスト1 | 2013-05-17 09:38:03 |
+--------------------+---------------------+
セットで 1 行 (0.00 秒)

ts2も更新されると思います。これは予想される動作ですか?

4

2 に答える 2

2

これは MySQL の深刻な問題です。

on updateまたはon deleteトリガーを使用しようとする場合も同様です。予想どおり、これらは外部キーの更新または削除でもトリガーされるはずですが、そうではありません。

これを回避する簡単な方法はありません。

これは、ほぼ 10 年前に最初に報告された深刻な ACID 準拠の失敗であり、まだ修正されていません。このバグレポートを読んでください。

于 2015-02-28T15:48:04.727 に答える