【问题标题】:Incorrect integer value: '' for column 'id' at row 1不正确的整数值:第 1 行的列 'id' 的 ''
【发布时间】:2021-08-26 23:18:16
【问题描述】:

我正在尝试插入我的 mySQL 数据库。第一列是“id”列,因为它是一个 auto_increment 字段,所以我将其留空。出于某种原因,我无法插入,并且收到下面提到的错误。感谢您对此提供的任何帮助。

我在尝试插入时收到以下错误:

Incorrect integer value: '' for column 'id' at row 1

我的查询

$insertQuery = "INSERT INTO workorders VALUES('', '$priority', '$requestType', '$purchaseOrder', '$nte', '$jobSiteNumber')";

【问题讨论】:

  • 你的表结构是什么——看起来你的第一个字段是一个整数,它不能除了''...尝试传递列然后是值——它可能是一个身份列...
  • 在将行值粘贴到 SQL 工作台时,这似乎不起作用 - 在 NULL 的情况下您仍然得不到整数或在零的情况下得到重复的值......有人有解决方案吗?

标签: mysql insert


【解决方案1】:

这可能意味着您的id 是一个AUTO_INCREMENT 整数并且您正在尝试发送一个字符串。您应该指定一个列列表并将其从您的INSERT 中省略。

INSERT INTO workorders (column1, column2) VALUES ($column1, $column2)

【讨论】:

  • 来这里的时候我已经知道这个选项,但我认为这是别的东西,因为代码以前在我的在线服务器上运行,但在我的本地主机上没有
  • 如果您使用 excel 或 CSV 上传批量数据,请确保禁用 auto_increment 和手动添加序列号。这对我有用,因为我不想完全取消限制
【解决方案2】:

要让 MySql 为 AUTO_INCREMENT 字段生成序列号,您有三个选项:

  1. 指定列列表并按照 njk 的建议从其中省略您的 auto_incremented 列。 那将是最好的方法。参见 cmets。
  2. 显式分配 NULL
  3. 显式分配 0

3.6.9. Using AUTO_INCREMENT:

...没有为 AUTO_INCREMENT 列指定值,所以 MySQL 自动分配序列号。您也可以明确地 将 NULL0 分配给列以生成序列号。

这三个语句将产生相同的结果:

$insertQuery = "INSERT INTO workorders (`priority`, `request_type`) VALUES('$priority', '$requestType', ...)";
$insertQuery = "INSERT INTO workorders VALUES(NULL, '$priority', ...)";
$insertQuery = "INSERT INTO workorders VALUES(0, '$priority', ...";

【讨论】:

  • @MHZ 您应该始终使用列列表。如果您的表结构发生变化会发生什么?如果列默认值为NULL,则不需要显式分配NULL
  • 选项 1 确实是“更好”的方法,并且可以使您的应用程序在将列添加到表时避免 MySQL 抛出错误,或者(更糟糕的是)将值填充到错误的列中,如果列重新排序。对于快速而肮脏的工作,0 或 NULL 技巧就足够了。但对于将在已部署应用程序中运行的代码,您需要选项 1。
  • njk 和 spencer7593 绝对公平点。在答案中特别提到了这一点。但我相信 OP 最好了解它的工作原理并了解所有选项。
  • 在插入新的 MySQL 条目时,将主键 int 值分配为 0 是在 FLASK 中使用 sqlalchemy 对我有用的唯一选项。谢谢你。 (我在此评论中添加了一些关键搜索词,希望对 Google 员工有所帮助,哈哈)
  • 如果你使用 Python 使用 None 而不是关闭 NULL 解决问题。
【解决方案3】:

尝试编辑您的 my.cf 并注释原始 sql_mode 并添加 sql_mode = ""

vi /etc/mysql/my.cnf

sql_mode = ""

保存并退出...

service mysql restart

【讨论】:

  • 谢谢@PJunior 这对我有用。我习惯于让 auto_increment 负责在 INSERT 上播种 id。 Ubuntu 18 路径为 /etc/mysql/mysql.conf.d/mysqld.cnf
  • @PJunior 我用你的回答解决了同样的问题。在我的情况下,我的插入查询为一个字段设置了一些空白值,并且该字段是 initeger 并且默认值设置为 NULL 意味着空白不被视为 NULL。所以我检查了我当前的 sql_mode 值,它是“STRICT_TRANS_TABLES”,所以我使用 sql 中的查询(设置 GLOBAL sql_mode = '';)将其删除,我的问题就解决了
  • 我正在关注这个解决方案,因为我的服务器最近刚刚从 MySQL 升级到 MariaDB,并且有很多应用程序在其中运行。在每个应用程序中找到每个 SQL 查询并一一修复它们会变得非常困难,尤其是遗留问题。
  • @PJunior,这正是我半小时以来一直在寻找的东西。为了更好地查找/阅读,我更新了文件位置:/etc/mysql/mysql.conf.d/mysqld.cnf 操作系统:Ubuntu/focal 注意:那里没有这样的密钥,我只是在那里添加了一个。跨度>
【解决方案4】:

这是因为您的数据发送列类型是整数,并且您正在向其发送字符串值。

所以,以下方式对我有用。 试试这个。

$insertQuery = "INSERT INTO workorders VALUES (
                    null,
                    '$priority',
                    '$requestType',
                    '$purchaseOrder',
                    '$nte',
                    '$jobSiteNumber'
                )";

不要使用'null'。将其用作null,不带单引号。

【讨论】:

  • NameError: name 'null' is not defined (FLASK sqlalchemy)。不,我没有使用单引号。
【解决方案5】:

对于wamp/phpmyadmin同样的错误,我编辑了my.ini,评论原文:

;sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

并添加了sql_mode = ""

【讨论】:

    【解决方案6】:

    如果有 phpMyAdmin,只需转到变量并查找 SQL 模式,变量,编辑它并删除变量的所有内容,然后保存。对于那些不想接触代码的人来说,这也应该可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-24
      • 2021-12-11
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多