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 KEY
或UNIQUE
键),某些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 返回错误值
无法选择最后插入的 id 为 [Mysql, php pdo oop] [重复] 的行