【问题标题】:Auto Increment failing自动增量失败
【发布时间】:2018-12-11 10:52:29
【问题描述】:

我有 2 个类似的表。一个带有自动增量值,一个没有。第一个表的第一列定义为INT(11), PRIMARY UNIQUE INDEX,在 phpmyadmin 的 EXTRA 下它显示为AUTO_INCREMENT

此代码不起作用并且不添加任何值。

mysqli_query($con, "INSERT INTO testtable1 VALUES ('', 'zzz', 'yyy')") ;

第二个表是删除第一列的同一个表。此代码有效。

mysqli_query($con, "INSERT INTO testtable2 VALUES ('jjj', 'fff')") ;

知道我错过了什么吗?在数据库上运行 7.2。

【问题讨论】:

  • 定义“不起作用”。有错误吗?那是什么错误?如果您只是测试查询本身,则从等式中删除 PHP 并直接针对数据库测试查询。表定义是什么?每个查询的结果是什么?预期的结果是什么?
  • 我同意。特别是因为您将使用查询从表中获取值。在同一个 phpmyadmjn 网页视图中,通过测试不同的 sql 语句,看看有什么效果。
  • 没有错误。它只是不再添加值。代码已经这样工作了 13 年。

标签: php mysql mysqli


【解决方案1】:

大概你的testtable1 有一个与(伪符号)相当相似的定义:

testtable1
------------
ID             INT      PK AUTOINCREMENT
SomeColumn     NVARCHAR
AnotherColumn  NVARCHAR

所以当你这样做时:

INSERT INTO testtable1 VALUES ('', 'zzz', 'yyy')

您明确告诉数据库将空字符串插入INT 列。这是行不通的。

AUTOINCREMENT 列不需要被告知有一个空值,它会自动增加。只需指定您要插入的值:

INSERT INTO testtable1 (SomeColumn, AnotherColumn) VALUES ('zzz', 'yyy')

让数据库引擎处理ID 列。一般来说,明确指定要插入值或从中选择值的列几乎总是值得的。它使代码更易于阅读/支持,并在表定义稍有变化时减少错误/错误的机会。

【讨论】:

  • @GarryJones:老实说,依靠糟糕的编码实践来保证未来并不是最好的主意。我可以理解代码中会有很多更改,但无论如何都应该进行这些更改。你所拥有的是大量的技术债务,这些债务已经回来解决了。在 SQL 代码中,减少代码大小以节省一些击键次数几乎没有任何价值,尽可能明确几乎总是要走的路。
  • 谢谢。有用。我的代码已经工作了 13 年,所以我的提供商发生了一些变化。但是我实际上想创建一个 ID 号来引用。我实际上想要工作的表只有 id 自动增量列 - - mysqli_query($conned, "INSERT INTO testtable1 () VALUES ()") ; -- 不添加行。我该怎么做?
  • 在创建值后,我通常使用 mysqli_insert_id 来获取它——我只添加了另外两列,看看我是否能弄清楚它为什么不起作用。那么,当您有一个包含自动增量列的表时,它是如何工作的呢?
  • @GarryJones:也许添加一列只是为了插入一个虚拟值?有一个只有 ID 的表是非常少见的。
  • 这里有人不想添加虚拟列,但他被告知的解决方案不再有效,可能是因为相同的升级。 stackoverflow.com/questions/1242623/…
【解决方案2】:

如果我没看错,第一个表有一个带有AUTO_INCREMENT 的 int(11)。

这意味着您应该使用与表 2 中类似的查询。仅传入两个非自动增量字段的值。

mysqli_query($con, "INSERT INTO testtable1 VALUES ('zzz', 'yyy')") ;

只要有 3 个字段,这将起作用,第一个是 auto inc int,另外两个是字符串。这是因为 auto inc 会自动处理第一列。

另外,请查看此link 或搜索 php MySQL predated statements 以使用准备好的语句来代替以确保安全。它将帮助您对抗 sql 注入。

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 2023-03-18
    • 1970-01-01
    • 2019-04-26
    • 2011-02-16
    • 1970-01-01
    • 2022-12-21
    • 2017-02-05
    相关资源
    最近更新 更多