2017-07-03 47 views
0

我对MySQL的行为有个疑问。MySQL替换成具有唯一约束的行为

想象一下表3(相关)列:

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

我已经穿上了(日期,用户)的唯一约束。所以,当我开始用干净的测试表,并两次运行下面的查询:

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

我期待与“ID”列一排1.而是每次我运行此查询的ID去,因为向上自动增量,我不能发生这种情况(这会破坏我的数据关系)。为什么是这样?我能否做到这一点,以便在发生替换时保留原始主键?

+1

显示此表的REAL模式 – RiggsFolly

+0

为什么不使用'update'? –

+0

@PrabhatG因为我想快速和肮脏;)严肃地说:我只是偶然发现了这种行为,我想更好地理解它。 – jwebdev

回答

1

不符合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值的行。)

0

对我来说,看起来就像你真正想要的UPDATE语句,而像

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