【问题标题】:PDO insert max id+1 not auto_incrementPDO 插入最大 id+1 不是 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 的自动增量 - 但是为什么呢?它不仅更方便,而且更安全。

标签: mysql pdo insert auto-increment


【解决方案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 语法有疑问,可以查看 documentationw3schools tutorials

【讨论】:

  • @mrunion 在 cmets 中说这是一个非常不安全的方法,因为 race conditions
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2013-05-26
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多