【问题标题】:mysql ON DUPLICATE KEY UPDATEmysql 重复键更新
【发布时间】:2010-05-03 16:40:19
【问题描述】:

我被困在使用 ON DUPLICATE KEY UPDATE 的 mySQL 查询上。

我收到了错误:

mySQL Error: 1062 - Duplicate entry 'hr2461809-3' for key 'fname'

表格如下所示:

id int(10) NOT NULL default '0',   
picid int(10) unsigned NOT NULL default '0',
fname varchar(255) NOT NULL default '',  
type varchar(5) NOT NULL default '.jpg',  
path varchar(255) NOT NULL default '',    
PRIMARY KEY  (id),  
UNIQUE KEY fname (fname),  
KEY picid (propid)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8;  

中断的查询是这样的:

INSERT INTO images SET picid=732, fname='hr2461809-3', path='pictures/' ON DUPLICATE KEY UPDATE picid=732,  fname='hr2461809-3', path='pictures/' 

我在应用程序的其他地方使用了一个非常相似的查询,没有任何问题。我不知道为什么这个会坏。我希望当 fname 上的 UNIQUE KEY 被违反时,它会简单地更新发生违反的行?

感谢您的帮助

【问题讨论】:

  • 你为什么使用 SET 和 INSERT 命令???
  • @animuson 那有什么问题?任何未指定的字段都将设置为其默认值或 NULL(如果允许)。
  • @rjh:使用(picid, fname, path) VALUES (732, 'hr2461809-3', 'pictures/') 有什么问题?正是这样的事情让语言变得如此混乱,为什么每个人都不能坚持 INSERT VALUES?
  • 我这样做是因为语句是从数组动态生成的,因此更容易将查询的两端设置为相同(插入和更新)。
  • @animuson:我不知道 SET 是 MySQL 对 ANSI 语法的扩展。感谢您的提醒。

标签: mysql insert unique-key mysql-error-1062


【解决方案1】:

我想你想要ON DUPLICATE KEY IGNORE

您要求在发生密钥冲突时简单地重新插入相同的数据。不出所料,这会导致另一个键冲突,因为它仍然是重复的行!

如果行已经存在,ON DUPLICATE KEY IGNORE 将中止插入。

【讨论】:

  • 为了进一步解释,ON DUPLICATE KEY UPDATE 只是改变了查询中插入的信息,所以如果你让它相同,它仍然会出错。该功能在那里,因此您可以在同一个查询中对其进行更改,这样它就不会出错。
猜你喜欢
  • 2012-04-27
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2021-09-17
相关资源
最近更新 更多