当前位置: 首页 > 知识库问答 >
问题:

SQL插入行并将插入的自动递增id复制到另一列

茅星华
2023-03-14

我正在使用PHP和MySQL。

将新行插入到具有自动递增 id 列的表中。
在插入此新行时,我想将新插入行的自动递增 id # 复制到同一行/条目中的另一列中。
创建时,新条目/行应具有自动递增的 id 列和具有相同编号的另一列。

我最大的担忧:
我需要所有这些都正确可靠地发生,即使来自其他连接的其他事务可能正在服务器上发生。

我对last_insert_id()知之甚少...我害怕能够可靠地使用它来满足我的需求...< br >我会不会遇到这样的情况:自动增加的id #已经增加了(可能是由于来自另一个连接的其他插入查询),而现在我得不到正确的id #?(当last_insert_id()在每个连接的基础上被提供给客户端时,我没有完全理解它的含义)。< br >

last_insert_id()是否会很好地处理事务,因为当事务进行回滚时,事务将变得未定义?(如果回滚另一个事务,然后我立即运行此脚本,我的脚本是否会为last_insert_id()返回NULL?)

我不明白mysql_insert_id();如何使用它以及它是否会帮助我。

到目前为止,我已经考虑过:

  1. 插入<code>列
  2. 插入一行;使用SELECT last_insert_id()更新<code>列
  3. 选择last_insert_id();插入<code>自动递增列

当我将选择的值插入自动递增列时会发生什么?自动增量生成器会从我插入的数字开始计数吗?如果我使用一个以前用过的值(但现在已经不存在了),并且在该值之后存在id #的记录,该怎么办?

表或行锁定是否允许我实现我想要的行为?

做这样的事情的正确/正确的方法是什么?

last_insert_id是独立于客户端的,并且将从该客户端返回最后插入行的 ID,因此您无需担心另一个连接上的用户与数据库进行交易的情况。

我仍然不完全理解这意味着什么...

对于一个基本场景:

INSERT row where id = 1;
SELECT last_insert_id(); outputs 1

Person A makes a connection to the db; SELECT last_insert_id(); outputs 1.
Person B makes a connection to the db; SELECT last_insert_id(); outputs 1?

Person A INSERT another row where id = 2;

Person A SELECT last_insert_id(); outputs 2?
Person B SELECT last_insert_id(); outputs... 1 or 2??

这里发生了什么?


还有一个真正让我担心的场景:

Person A makes a connection with the db;
Person A SELECT last_insert_id(); outputs 1

Person A INSERT row where id = 2;
Person A SELECT last_insert_id(); outputs 2

Person B makes a connection with the db;
Person B SELECT last_insert_id(); outputs 2
Person B INSERT row where id = 3;

Person A SELECT last_insert_id(); outputs 2??
Person B SELECT last_insert_id(); outputs 3??

在这种情况下,人员A的last_insert_id()落后一个计数。如果这是真的,那么我将无法使用我的#3方法

无论我在哪里出错,请为我纠正我的输出。

共有2个答案

越雨泽
2023-03-14

考虑到您可能对数据库有多重访问权限,

我将做:

1,只需插入新行,并将<code>null[autoID_Copy]

2,那么我可以运行这个:

update table set autoID_Copy= autoID where autoID_Copy is null 

甚至为了加快速度,您可以在timeInstered处执行<code>操作

希望对此有所帮助。

陆星文
2023-03-14

您应该查看这篇关于MySQLlast_insert_id的文章

last_insert_id是独立于客户端的,并且将从该客户端返回最后插入行的 ID,因此您无需担心另一个连接上的用户与数据库进行交易的情况。

 类似资料:
  • 问题内容: 这是场景: 我正在尝试在插入表时创建引用记录。但是我得到的是null,因为它是自动从序列中生成的。我也尝试了触发器插入,但是结果是一样的。有什么办法解决吗? 问题答案: 避免使用规则,因为它们会再次咬住您。 在每行运行的表a上使用after触发器。它看起来应该像这样(未经测试):

  • 现在我想从nodejs插入。我已经试过了,但不起作用

  • 问题内容: 在MySQL中,我试图复制一排的 自动增量 和 插入 数据到同一个表的新行。 如何在单个查询中执行此操作? 问题答案: 用途: 除以外的所有列都在哪里?如果要显式插入2,则将其包括在INSERT列列表和SELECT中: 当然,在第二种情况下,您必须注意2 的可能重复项。

  • 问题内容: 使用MySQL 5.1.49,我正在尝试实现一个标记系统,我的问题是有两列的表:, (InnoDB) 使用query时,即使忽略了插入,自动增量值也会增加。 通常,这不会有问题,但是我希望有很多尝试为该特定表插入重复项,这意味着我下一个新行字段的值将跳得太多。 例如,我最终得到一个表,该表具有3行,但错误的是 另外,如果我不做而只是定期做并处理错误,则自动递增字段仍会增加,因此下一个真

  • 问题内容: 我正在寻找这样的查询: id | int | 自动增量 varchar | 255 这样桌子就看起来像 1 | val1 2 | val2 3 | val3 … 除了id总是以每一行都结束而已。 我怎样才能做到这一点? 问题答案:

  • 问题内容: 请考虑下表: 我将以这种方式向其插入条目。 如何知道为它创造了什么价值?仅使用该字段执行SELECT是无效的,因为可能会有重复的条目。 问题答案: 通过普通的SQL: 有关详细信息,请参见手册:http : //db.apache.org/derby/docs/10.7/ref/rrefidentityvallocal.html 从Java类(通过JDBC)执行此操作时,可以在通过适当