外键更新时未更新时间戳

时间:2013-05-17 14:51:29

标签: mysql foreign-key-relationship

我正在使用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>   insert into table1 (col1) values ('test'); 
Query OK, 1 row affected (0.00 sec)

mysql>   insert into table2 (col1) values ('test');
Query OK, 1 row affected (0.00 sec)

mysql> select * from table1;
+------+---------------------+
| col1 | ts1                 |
+------+---------------------+
| test | 2013-05-17 09:37:56 |
+------+---------------------+
1 row in set (0.00 sec)

mysql> select * from table2;
+------+---------------------+
| col1 | ts2                 |
+------+---------------------+
| test | 2013-05-17 09:38:03 |
+------+---------------------+
1 row in set (0.01 sec)

mysql> update table1 set col1='test1' where col1 = 'test';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from table1;
+-------+---------------------+
| col1  | ts1                 |
+-------+---------------------+
| test1 | 2013-05-17 09:44:28 |
+-------+---------------------+
1 row in set (0.00 sec)

mysql> select * from table2;
+-------+---------------------+
| col1  | ts2                 |
+-------+---------------------+
| test1 | 2013-05-17 09:38:03 |
+-------+---------------------+
1 row in set (0.00 sec)

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

2 个答案:

答案 0 :(得分:2)

这是MySQL的一个严重问题。

如果您尝试使用 on update on delete 触发器,则同样适用。正如预期的那样,即使在外键更新或删除时也会触发,但它们不会。

没有简单的解决方法。

这是一个严重的ACID合规性故障,在大约10年前首次报告并且仍然没有修复。阅读this bug report

答案 1 :(得分:0)

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