【问题标题】:Duplicate entry '0' for key 'PRIMARY' in empty table空表中键“PRIMARY”的重复条目“0”
【发布时间】:2015-04-20 06:00:59
【问题描述】:

我目前正在开始 Web 开发,现在正在编写一个非常简单的脚本,该脚本将条目数据从 from 发布到 mysql 数据库。但我一直遇到的问题是,当我提交表单时,出现以下错误:

Error: Duplicate entry '0' for key 'PRIMARY'

对我来说,这似乎是一个非常奇怪的错误,因为表完全是空的,ID 设置为 auto_increment,我没有尝试为其分配任何值。

我在 Mac OS 上使用 Xampp 作为我的本地主机。

这是我的表单(.php):

这是我的mysql入口脚本(.php):

结果是这样的:

这是数据库设置:

奇怪的是,当表为空时,我第一次通过表单插入时,数据库中确实有一些东西。但它缺少“电子邮件”和“密码”并显示“NULL”。第二次使用表单时,数据库中没有添加任何内容:

【问题讨论】:

  • 请将任何代码作为文本或文本链接,没有人有时间重新键入它以便为您调试它。另请阅读stackoverflow.com/tour,这可能会有所帮助stackoverflow.com/help/formatting
  • 您首先进行 3 次插入将起作用,并且添加密钥 0 2nd 将由于重复而失败 - 无论如何,您都不应该进行 3 次插入,只需 1 次
  • 非常感谢,我会去参观的!

标签: php mysql database duplicates


【解决方案1】:
  1. 您的id不是似乎是自动递增的。它不会为每一行生成一个新的 id。如果您不为其提供值,则默认为 0
  2. 尽管如此,该列上仍有 UNIQUE/PRIMARY 约束,因此 ID 0 不能出现多次。由于您没有提供 id 并且 MySQL 没有生成 id(因为该列不是自动递增的),因此您不能插入多于一行。
  3. 您正在发出三个单独的 INSERT INTO 语句,这将导致插入三个单独的行(如果您可以插入多行,见上文),每个都具有不同的值集;但绝不会在一行中设置所有值。

所以:

  1. 让您的 id 列真正自动递增。
  2. 准备一个INSERT INTO 语句,一次性插入所有值:

    INSERT INTO members (name, email, password) VALUES (.., .., ..)
    
  3. 请参阅Why shouldn't I use mysql_* functions in PHP? 并停止使用mysql_*。了解准备好的语句,阅读The Great Escapism (Or: What You Need To Know To Work With Text Within Text) 了解原因。

【讨论】:

  • 非常感谢 deceze!这解决了问题!
猜你喜欢
  • 1970-01-01
  • 2013-09-03
  • 2017-08-07
  • 2018-02-20
  • 2014-09-04
  • 2023-03-07
  • 2018-07-11
  • 2012-08-24
相关资源
最近更新 更多