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');
查询正常,1 行受影响(0.00 秒)

mysql> 插入 table2 (col1) 值 ('test');
查询正常,1 行受影响(0.00 秒)

mysql> 从表 1 中选择 *;
+--------+----------+
| col1 | ts1 |
+--------+----------+
| 测试 | 2013-05-17 09:37:56 |
+--------+----------+
一组中的 1 行(0.00 秒)

mysql> 从表 2 中选择 *;
+--------+----------+
| col1 | ts2 |
+--------+----------+
| 测试 | 2013-05-17 09:38:03 |
+--------+----------+
一组中的 1 行(0.01 秒)

mysql> 更新 table1 设置 col1='test1' 其中 col1 = 'test';
查询正常,1 行受影响(0.00 秒)
匹配行:1 更改:1 警告:0

mysql> 从表 1 中选择 *;
+--------+----------+
| col1 | ts1 |
+--------+----------+
| 测试1 | 2013-05-17 09:44:28 |
+--------+----------+
一组中的 1 行(0.00 秒)

mysql> 从表 2 中选择 *;
+--------+----------+
| col1 | ts2 |
+--------+----------+
| 测试1 | 2013-05-17 09:38:03 |
+--------+----------+
一组中的 1 行(0.00 秒)

我希望 ts2 也会更新。这是预期的行为吗?

4

2 回答 2

2

这是 MySQL 的一个严重问题。

如果您尝试使用on updateon delete触发器,这同样适用。正如预期的那样,这些甚至应该在外键更新或删除时触发,但它们不会。

没有简单的解决方法。

这是大约 10 年前首次报告的严重的 ACID 合规性失败,但仍未修复。阅读此错误报告

于 2015-02-28T15:48:04.727 回答
0

是的,这是按设计运行的。您根本没有更新 table2 。

于 2013-05-17T15:09:36.103 回答