【问题标题】:MySql Update on Duplicate (Unique) Key errorMySql 更新重复(唯一)密钥错误
【发布时间】:2017-10-05 23:40:14
【问题描述】:

我正在开发一个带有 MySql 数据库的遗留 php 应用程序。

应用中有一个表格如下:

CREATE TABLE IF NOT EXISTS `cards` (
    `score` smallint NOT NULL,
    `cardId` varchar(80) NOT NULL,
    `probability` DECIMAL(20,19),
    `autoTs` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    KEY `autoTs`    (`autoTs`),
    UNIQUE KEY `score_ cardId` (`score`, `cardId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

所以唯一的 id 是 score_cardId 因为这些的概率会随着时间而改变。 现在我正在尝试将新的概率值插入到我知道有唯一键的数据库表中,但是我只是不断从 MySql 收到相同的错误:

"Duplicate entry '600-cardKey1' for key 'score_ cardId'

这是我的更新代码;不确定我需要更改什么才能更新存在重复唯一键的位置:

INSERT INTO cards 
  (score, cardId, probability) 
 VALUES 
(600, 'cardKey1', 0.773360594), 
(543, 'cardKey2', 0.770445253);
ON DUPLICATE KEY UPDATE score = VALUES(score), cardId = VALUES(cardId), probability = VALUES(probability);

有什么想法吗?我尝试了“ON DUPLICATE KEY UPDATE”的几种不同变体。这实际上在 SQL 中手动工作,但我有太多行无法手动更新,所以想知道发生了什么。

【问题讨论】:

  • 你应该知道INSERT是新建一行数据。 UPDATE 是更改现有数据行的值。因此,当您使用 INSERT 更新现有行时,显然会出现“重复条目”错误。另外,当您的问题完全与 MySQL 相关时,请不要标记 PHP。
  • 是的;我知道。但是从我读到的 MySql 中,如果这个键已经存在,那么我们应该更新。问题是更新功能似乎不起作用;尽管仅针对其中一条错误行运行它确实有效。
  • @rl279 - 只需删除;在ON DUPLICATE 之前尝试..!

标签: mysql


【解决方案1】:

尝试删除;之前ON DUPLICATE

INSERT INTO cards 
(score, cardId, probability) 
 VALUES 
(600, 'cardKey1', 0.773360594), 
(543, 'cardKey2', 0.770445253) ON DUPLICATE KEY 
UPDATE score = VALUES(score), cardId = 
VALUES(cardId), probability = VALUES(probability);

【讨论】:

    【解决方案2】:

    由于您只想更新概率,因此将语句更改为:

    INSERT INTO cards(score, cardId, probability) 
    VALUES (600, 'cardKey1', 0.773360594), (543, 'cardKey2', 0.770445253)
    ON DUPLICATE KEY UPDATE probability = VALUES(probability);
    

    【讨论】:

    • 谢谢里卡多;我也尝试过,但仍然出现错误并且没有更改数据库。
    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2013-09-07
    • 2014-10-31
    • 2017-10-17
    • 2018-06-24
    相关资源
    最近更新 更多