根据唯一索引重复插入或更新

时间:2014-02-13 20:31:24

标签: php sql primary-key

这是我想要做的。如果表中已存在唯一索引(代码),则插入。如果存在则只需更新行。

我无法使用主键,因为它是自动增量ID。这是代码

 $sql="INSERT INTO codes (code,registration,country) 
VALUES ('$war','$regi','$country') ON DUPLICATE KEY UPDATE code='$war', registration='$regi', country='$country'";

但它不起作用,因为我认为它正在检查重复的主键。因此,当我尝试插入列代码的值与前一行相同的行时,我得到Duplicate entry' xxx'对于密钥'代码'错误。那么如何使这个工作为唯一索引代码?

艾哈迈尔

3 个答案:

答案 0 :(得分:0)

ON DUPLICATE KEY UPDATE适用于UNIQUE索引以及PRIMARY KEY值。尝试将您尝试更新的其中一个值设置为数据库表中的UNIQUE

答案 1 :(得分:0)

您只需将code设置为唯一索引即可。然后,只要您尝试执行code匹配的插入,它就会更新。

根据需要更改此代码

alter table `table` add unique index(`code`);

答案 2 :(得分:0)

你是对的,在你的桌子上有一个主键不允许你插入重复的键值。

过去,我使用过这样的东西:

SELECT COUNT(*) FROM代码 WHERE code ='$ war'

然后,如果计数是> 0,你知道有重复,你做了:

更新代码 SET registration ='$ regi',country ='$ country' WHERE code ='$ war'

否则你会这样做:

INSERT INTO代码(代码,注册,国家/地区) 价值('$ war','$ regi','$ country')

但是,如果我们假设您使用的是MySQL,那么您可以使用INSERT IGNORE或REPLACE。

如果您使用:

INSERT IGNORE代码(代码,注册,国家/地区) 价值('$ war','$ regi','$ country')

如果代码尚不存在,将插入值。如果代码确实存在,则不会插入任何记录,MySQL将以静默方式丢弃该语句而不会产生错误。

我认为你可能想要的是:

更换INTO代码(代码,注册,国家/地区) 价值('$ war','$ regi','$ country')

如果记录是新的,则REPLACE INTO的行为就像INSERT INTO一样。但是如果主键是重复的,它将执行UPDATE。

同样,INSERT IGNORE和REPLACE INTO仅适用于MySQL。

参考:http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm