PDO 插入最大 id+1 不是 auto_increment

Posted

技术标签:

【中文标题】PDO 插入最大 id+1 不是 auto_increment【英文标题】:PDO insert max id+1 not auto_increment 【发布时间】:2019-02-11 17:34:20 【问题描述】:

我不想使用 mysql 的自动增量,但我想获取 max id+1 作为 ID 插入下一个数据。

我试着做How to get auto increment id by PDO before execute 但没有运气。

$sql = "INSERT INTO checklist ((SELECT MAX(checklist_id)+1), checklist_name ) VALUES (NULL, :checklist_name)";

$pdo_statement = $pdo_conn->prepare( $sql );

$result = $pdo_statement->execute ((array(':maxid'=>NULL,':checklist_name'=>$_POST['checklist_name']));

你能帮我看看应该是什么代码吗?

【问题讨论】:

你知道这很危险。如果两个 INSERT 同时命中怎么办?然后,您将从“SELECT MAX(.....)”中获得相同的结果,然后两个 INSERT 语句将尝试插入相同的 ID,从而导致其中一个出现错误。你为什么不想使用自动增量?你的用例是什么? 如果您在表中使用AUTO_INCREMENT 列(结合PRIMARY KEYUNIQUE 键),某些MySQL 的功能将得到更好的优化,并且在使用时差异(非常)明显InnoDB 作为表引擎(dev.mysql.com/doc/refman/8.0/en/…)...事实上,每个 InnoDB 表都应该有一个 PRIMARY 或 UNIQUE 键以获得更好的性能我曾经发布过一个关于它的答案(让我看看我是否还能找到它) " 事实上,每个 InnoDB 表都应该有一个 PRIMARY 或 UNIQUE 键以获得更好的性能我曾经发布过一个关于它的答案(让我看看我是否还能找到它)“找到它dba.stackexchange.com/questions/48072/… 我不想使用 mysql 的自动增量 - 但是为什么呢?它不仅更方便,而且更安全。 【参考方案1】:

编辑:正如上面一位评论者所指出的那样;不建议在您的 MySQL 数据库中没有 PRIMARY Key

您的 SQL 查询错误。您需要分别拥有列和值。

$sql = "INSERT INTO checklist ((SELECT MAX(checklist_id)+1), checklist_name ) VALUES (NULL, :checklist_name)";

要使您的 INSERT 语句正确,请查看 documentation

INSERT INTO table (column, column, etc.) VALUES (value, value, etc.)

因此,为了使您的陈述正确,您必须切换一些变量

INSERT INTO checklist (checklist_id, checklist_name) VALUES ((SELECT MAX(checklist_id)+1 FROM checklist), :checklist_name)

您的绑定值数组将如下所示

array(':checklist_name' => $_POST['checklist_name'])

如果您对任何 SQL 语法有疑问,可以查看 documentation 或 w3schools tutorials。

【讨论】:

@mrunion 在 cmets 中说这是一个非常不安全的方法,因为 race conditions

以上是关于PDO 插入最大 id+1 不是 auto_increment的主要内容,如果未能解决你的问题,请参考以下文章

使用“之前”触发器插入后的 MySQL PDO LastInsertID 返回错误值

使用 PDO 插入时忽略重复键

调试 PDO mySql 将 NULL 插入数据库而不是空

无法选择最后插入的 id 为 [Mysql, php pdo oop] [重复] 的行

PDO postgresql 最后插入的 id 返回 'false' 或 -1

如何获取最后插入的ID,以及PDO列的名称?