【问题标题】:How to insert id's number in the same row?如何在同一行中插入id的号码?
【发布时间】:2016-09-06 11:24:24
【问题描述】:

我正在尝试将id 的数量放在邻居列中。像这样的:

+----+-------------------+
| id | identical_with_id |
+----+-------------------+

idAUTO INCREMENT,插入时只需要获取 id 的号码。我可以这样做:

INSERT INTO `table_name`
  VALUES( NULL, 
          (SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES 
             WHERE TABLE_SCHEMA = 'database_name' AND
                   TABLE_NAME   = 'table_name')
        );

但我不知道它会一直有效。可能在执行该子查询插入该行之间,插入一个新行(另一行)。在这种情况下,id 的数量将与邻居列不同。哼?这可能吗?


注意:请不要告诉我:“你需要这个做什么?”

【问题讨论】:

  • @meskobalazs 通过使用触发器没有任何改变。我仍然担心在执行我的插入查询和执行该触发器之间,另一行得到插入,然后这两列将不匹配。
  • 是的,我意识到它不会工作,因为自动增量
  • this 的重复?

标签: mysql sql auto-increment


【解决方案1】:

通常每个人有时都需要做这样的事情。而且最好不要问原因:)

我认为您以正确的方式执行此操作,但您需要检查您使用的是哪个 MySql 引擎并确保按顺序执行 inserts

通常插入语句会锁定表并在完成时解锁。这意味着您检索 auto increment 的查询非常安全。

对于 MySql 引擎和相关设置,这篇文章可以帮助你:

Does a MySQL multi-row insert grab sequential autoincrement IDs?

对于 InnoDb:

http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

【讨论】:

  • 非常非常好..!这句话正是我要找的:insert statement will lock the table and unlock when it's finished。点赞
  • 看,我不太懂英语。我的存储引擎是 InnoDB。在您附加的那个链接中,InnoDB 对我来说安全吗?
  • 但首先检查你的引擎和相关设置。正如你在那篇文章中看到的那样。对于 InnoDb,您需要进行一些更改..
  • 我已经用 InnoDb 链接更新了答案。在那里您可以找到设置步骤。
  • 如何使用LOCK TABLES ...(我正在使用innodb引擎)stackoverflow.com/questions/8481421/…`
【解决方案2】:

您可以在查询后立即使用 LAST_INSERT_ID()。

INSERT INTO `table_name` VALUES( NULL, NULL);
SELECT LAST_INSERT_ID() INTO @last_id;
UPDATE `table_name` SET duplicate_id_column = @last_id WHERE id = @last_id;

【讨论】:

  • 我仍然担心在执行我的插入查询和执行我的更新查询之间,另一行得到插入,然后这两列将不匹配。
  • 这就是为什么我添加了验证 WHERE id = @last_id;
  • 啊..我可以在一个查询中同时编写insertupdate 语句吗?
  • @stack 你可以有一笔交易。
  • 如果您随后执行查询,我认为您是非常安全的。 mysql 文档建议使用相同的方法:dev.mysql.com/doc/connector-odbc/en/… 如果您仍然对此有任何担忧并且这对您的应用程序绝对至关重要,我建议您从应用程序端进行操作,即使执行时间需要更长的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多