【问题标题】:Double DUPLICATE KEY UPDATE entry error双 DUPLICATE KEY UPDATE 输入错误
【发布时间】:2012-02-29 20:00:53
【问题描述】:

我试图上传一个 csv 文件来更新我的数据库中的一个表,但也想防止重复。最初一个 DUPLICATE 有效,但是当我添加第二个条件时它不起作用。 我得到“键 PRIMARY 的重复条目 '1'”。我怎样才能实现我的目标。

感谢您的帮助。

$sql = "INSERT INTO biodata (student_number, fname, lname, course_name, level)
        VALUES('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]')
        DUPLICATE KEY UPDATE student_number = student_number
        AND course_name = course_name";

 mysql_query($sql) or die (mysql_error());

【问题讨论】:

  • 表中PRIMARY KEYUNIQUE KEYs分别是什么?
  • 只有 student_number 是主键
  • 所以,每个学生只能选修一门课程,对吧?
  • 不是说他们每学期只能选一门课,而是他们实际上可以在一个学期选修一门特定课程,同时选修其他课程。
  • 使用您现在的设计,学生不能出现在此表中超过 1 行。因此,没有人可以选修一门以上的课程。曾经。您应该重新检查设计。可能会更改PRIMARY KEY 或/和将信息拆分为更多表:一张用于学生信息,一张用于课程信息,一张用于注册信息(此表)。

标签: php mysql csv duplicates


【解决方案1】:

UPDATE 部分中将AND 替换为逗号,

使用VALUES() 语法来引用传递的值。

另外,您不需要更新主键或唯一键(激活ON DUPLICATE KEY UPDATE):

$sql = "
  INSERT into biodata
    (student_number, fname, lname, course_name, level) 
  VALUES
    ('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]')
  ON DUPLICATE KEY UPDATE 
                      --- student_number = VALUES(student_number),
                      --- removed
      fname = VALUES(fname),
      lname = VALUES(lname),
      course_name = VALUES(course_name),
      level = VALUES(level)
" ;

上面的代码做了什么:

如果INSERT 失败(已经有一个学生使用此student_number 您正在尝试插入),UPDATE 被激活并更新其他 4 个字段。

您可以选择更新哪些字段。例如,如果您想更新 course_name 字段,只需保留该行并删除其余部分。

【讨论】:

  • 正是我想要的。谢谢。
  • 你为什么要编辑代码,第一个代码对我来说效果很好。这有什么原因吗?请解释。谢谢。
【解决方案2】:

我想你误解了 重复密钥更新 构造。 IT 确实没有定义重复密钥何时发生的条件,而是定义此类事件发生时的解决方案。因此,您可以以某种方式修改密钥,这不会导致重复。 重复的条件是通过表定义中的索引和(主)键定义的。因此,根据您上面的代码,您将在表定义中为 student_number 和 course_name 添加一个唯一键。

更多参考请查看docu

【讨论】:

  • 我只有 student_number 作为主键。
猜你喜欢
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2017-06-29
  • 2018-06-27
  • 2014-10-18
相关资源
最近更新 更多