【问题标题】:"insert on duplicate update" still inserts duplicates“插入重复更新”仍然插入重复项
【发布时间】:2012-07-06 09:17:43
【问题描述】:

我有一个以 descriptionId 作为主键的 mysql 表,它是自动递增的。它还有一个“内容”和一个“价格”列等等。

我还有一个由多个输入框组成的表单,其中包含我的描述表中价格和内容列的当前数据库值。提交表单后,我想用新值更新表格,如果删除了任何输入框,则必须从表格中删除记录。

我还设法定义了三个数组来保存我所有表列的值。这些数组如下:$descrId,$content,$price

当我提交表单时,php 文件会遍历这些数组并执行以下查询:(我已经验证了这些数组,因此它们可以正常工作)

INSERT INTO     
description(descriptionId,content,price,orderNo,salesPerson,dateTime,updated)
VALUES('{$descrId[$k]}','{$content[$k]}','{$price[$k]}','{$orderId}','{$sale}',NOW(),1 ) 
ON DUPLICATE KEY UPDATE content=VALUES(content),price=VALUES(price),updated=1, dateTime=NOW()

但是,只要我按下提交,此查询就会不断重复值。

感谢您的宝贵时间......

【问题讨论】:

  • 我没有看到检查重复项的 KEY,还是我遗漏了什么?
  • 在那些不想重复的列上是否有唯一键?自动增量时也不需要插入descriptionId
  • 键是 descriptionId 广告是重复键部分中唯一考虑的字段。您确定 descriptionId 是重复的,还是只是其他数据?
  • “descriptionId 作为主键并且它会自动递增”...如果您的主键是自动递增的,您希望它如何重复?!跨度>
  • 所有其他字段都是重复的,但不是主键,这意味着我将相同的值插入到我的表中。它们在我的表中没有重复,但我的表中有重复的行(当然 descriptionId 除外)

标签: php mysql


【解决方案1】:

当我读到你的问题 ON DUPLICATE KEY 永远不会发生,因为你的 主键 是一个自动递增的值,每次你在表中插入一些东西时它都会 +1,所以它永远不会有一个重复的值 - 这或多或少是 AUTO INCREMENT 背后的想法。

所以答案是选择另一列,即orderNodateTime,将其设为UNIQUE,然后再尝试查询。

更新
或者,您可以组合两列或多列并将它们定义为(唯一)键。
如果这也不适用于您的情况,则在插入数据时使用一些散列函数/算法并将该散列与表中的其他值一起存储。

【讨论】:

  • 感谢您的快速响应。我的表中没有其他列可以是唯一的,因为它们往往具有共同的值。无论如何我可以解决这个问题吗?
  • 甚至不是orderNo?你对同一个 òrderNo? dateTime 有不同的描述,最终会成为另一个候选人
  • 每个 orderNo 都有很多描述,所以 orderNo 不能是唯一的。从 dateTime 开始,由于很少有描述同时添加到数据库中,因此 dateTime 也不能是唯一的。还有其他选择吗?
  • 您可以将两列或多列的组合作为(唯一)键。在 Partitioning 之后查看MySQL's Documentation
  • 另请参阅我的回答的更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2012-04-21
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多