更新:错误已修复,错误修正将随下一版本6.2.4一起提供。谢谢大家的帮助:http://bugs.mysql.com/bug.php?id=74140
我非常确定我在MySQL Workbench中发现了一个错误。下表给出了:
CREATE TABLE `table` (
`id` varchar(100) NOT NULL,
`uid` bigint(20) unsigned NOT NULL,
`level` mediumint(9) NOT NULL DEFAULT '0',
`cstamp` int(11) NOT NULL,
`dstamp` int(11) NOT NULL,
UNIQUE KEY `unique` (`id`,`uid`,`dstamp`),
KEY `uid` (`uid`,`level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
没有PRIMARY KEY
,只有UNIQUE KEY
。此表中的数据如下所示:
+----+------------+-------+------------+--------+
| id | uid | level | cstamp | dstamp |
+----+------------+-------+------------+--------+
| 1 | 0 | 3 | 1391701710 | 0 |
| 1 | 1 | 2 | 1391701710 | 0 |
| 1 | 123456 | 1 | 1391701710 | 0 |
| 1 | 7463529567 | 0 | 1391701710 | 0 |
| 2 | 0 | 3 | 1397577347 | 0 |
| 2 | 1 | 2 | 1397577347 | 0 |
| 2 | 123456 | 1 | 1397577347 | 0 |
| 2 | 3856438345 | 0 | 1397577347 | 0 |
| ...| ... | ... | ... | ... |
+----+------------+-------+------------+--------+
不,我在特定的id
上使用WHERE进行选择,例如
SELECT * FROM `table` WHERE `id` = 2
我得到了这个结果:
+----+------------+-------+------------+--------+
| id | uid | level | cstamp | dstamp |
+----+------------+-------+------------+--------+
| 2 | 0 | 3 | 1397577347 | 0 |
| 2 | 1 | 2 | 1397577347 | 0 |
| 2 | 123456 | 1 | 1397577347 | 0 |
| 2 | 3856438345 | 0 | 1397577347 | 0 |
+----+------------+-------+------------+--------+
然后我用GUI将这4行的dstamp
更改为非零值,然后按" Apply"。 Workbench首先向我显示UPDATE语句如下:
UPDATE `db`.`table` SET `dstamp`='1411994456' WHERE `uid`='0';
UPDATE `db`.`table` SET `dstamp`='1411994456' WHERE `uid`='1';
UPDATE `db`.`table` SET `dstamp`='1411994456' WHERE `uid`='123456';
UPDATE `db`.`table` SET `dstamp`='1411994456' WHERE `uid`='3856438345';
那是错的!该语句将使用uid = 0
更新所有行,而不仅仅使用id = 2
更新该行。
在我更新到这个新版本的Workbench之前,它完美无缺。我经常这样改变这张桌子。
出了什么问题?没有PRIMARY KEY
来标识特定行,但有一个UNIQUE KEY
不用于通过Workbench生成的UPDATE。我认为Workbench只需使用UNIQUE KEY
中的列或禁止以这种方式进行更新,不是吗?