MySQL 替换为具有唯一约束的行为

MySQL replace into behavior with unique constraint

我有一个关于 MySQL 行为的快速问题。

假设一个 table 有 3 个(相关)列:

id (PK + AI),somedate,someuser,etc...

我对(日期,用户)设置了唯一约束。所以当我开始一个干净的测试 table 和 运行 以下查询两次:

REPLACE INTO `testtable` (somedate,someuser) VALUES('2017-01-01','admin');

我希望在 1 上有一个 'id' 列的行。但是每次我 运行 这个查询时,id 因为自动递增而上升,我不能让这种情况发生(这会破坏我的数据关系)。为什么是这样?我可以这样做以便在发生替换时保留原始主键吗?

不适用于 REPLACE。这就像 INSERT 前面有 DELETE。您使用 REPLACE 观察到的行为与您执行以下两个语句时看到的行为相同:

 DELETE FROM `testtable` WHERE somedate = '2017-01-01' and someuser = 'admin';
 INSERT INTO `testtable` (somedate,someuser) VALUES ('2017-01-01','admin');

这意味着新插入行的 auto_increment 列将具有新值。


或许可以考虑使用 INSERT ... ON DUPLICATE KEY UPDATE

参考:https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

(请注意,尝试插入更新的行将使用 auto_increment 值。)

在我看来你实际上想要一个 UPDATE 语句而不是

update `testtable` 
set somedate = '2017-01-01',
    someuser = 'admin'
where id = <id of the record> ;