【问题标题】:How to use auto-increment Id in another column in same INSERT QUERY in MYSQL?如何在 MYSQL 的同一 INSERT QUERY 的另一列中使用自动增量 ID?
【发布时间】:2018-11-14 11:22:53
【问题描述】:

如何在MYSQL的INSERT QUERY的另一列中使用自增ID?

我想用代码添加用户。就像插入后的user_id1 代码将是US1 同样如果插入后的user_id954 代码将是US954

这就是我目前正在做的事情

"INSERT INTO `users` (`user_id`, `user`, `code`) VALUES (NULL, 'Alice', NULL);"

然后在 PHP (Codeigniter) 中检索最后一个插入 id

$insert_id = $this->db->insert_id();

然后使用自动递增 id 更新代码

"UPDATE `users` SET `code` = CONCAT('US', '" . $insert_id . "') WHERE `user_id` = " . $insert_id . ";";

你是否可以在 MYSQL 的单个 INSERT QUERY 中做到这一点?

编辑: 这与Insert/ update at the same time in a MySql table? 不同。因为这个问题同时询问两个用户的并发操作,这不是我的问题

【问题讨论】:

  • 不,考虑一下,你问是否有可能在鸡下蛋之前得到鸡蛋!
  • “你问是否有可能在鸡下蛋之前得到鸡蛋!”是什么让我想知道是先有鸡还是先有蛋? @SPlatten
  • @RaymondNijland 哈哈,我现在明白了。
  • @RaymondNijland, :) 在这种情况下,一旦插入记录,您就可以获得最后一个插入 ID,但这里需要使用相同的 ID...我建议编写一个存储的使您能够更轻松地管理此类事情的过程。
  • "在这种情况下,一旦插入记录,您可以获得最后一个插入 ID,但这里需要使用相同的 ID。"我知道@SPlatten 我确实发布并删除了一个关于LAST_INSERT_ID() 的答案.. 因为它不确定topicstarter 是否需要它并且因为它想在一个查询中完成它。

标签: php mysql


【解决方案1】:

是的,这是可能的。 您可以使用 MySQL 中的 Store Procedure(SP) 来完成。 您必须为每次注册调用一次 SP,而不是两次查询(您已经这样做了)。

这将节省大量的执行时间。

    https://stackoverflow.com/questions/14957788/insert-and-update-with-stored-procedure    
    https://www.w3resource.com/mysql/mysql-procedure.php
    https://www.sitepoint.com/stored-procedures-mysql-php/
    http://php.net/manual/en/mysqli.quickstart.stored-procedures.php

请使用以上链接了解更多信息。

我建议使用 SP 进行登录/注册。它将为您的 PHP Web 应用程序提供额外的功能。

对于您的基本示例。我已经和你分享了类似的 SP 代码。

BEGIN
declare autoIncr int;
//insert code
autoIncr = LAST_INSERT_ID(); 
//update code
END

【讨论】:

  • 这并没有给我任何可靠的答案。我不知道在你的答案中寻找什么
  • 您的问题是,您必须使用单个查询来实现。同样,您可以使用单个 SP 调用而不是两个不同的查询调用来实现。
  • 如果我在SP中单独插入和更新,那么使用它没有意义。因为我可以在代码中分别运行插入和更新查询。与 SP 相比,它会花费更少的时间。
  • SP 花费的时间更少。如果您将调用插入和更新查询,那么每次调用数据库服务器。但是在SP中,php只调用数据库服务器一次,数据库服务器可以在一次数据库调用中执行查询,而不是两次调用数据库。
  • 要使用 SP,您必须获得托管服务提供商的 SP 权限。一些托管服务提供商不允许这样做。除非你拥有你的服务器。并且进行插入和更新查询只会使差异可以忽略不计。
【解决方案2】:

使用 MAX(user_id)+1 获取新的 user_id,然后将其与您的字符串连接

INSERT INTO `users` (`user`, `code`) SELECT 'Alice',CONCAT("US",MAX(user_id)+1) from users

【讨论】:

  • 如果例如超过 300 人同时插入,那么每个用户的最大 user_id 将不同。此外,在插入数据之前,您不会获得带有 MAX(user_id) 的实际 user_id。否则它会给你最后一次更新 id
【解决方案3】:

当您创建表和列时,如果您给出了 user_id 的值自动递增。之后,当您要插入数据时,无需提供 user_id 的值,因为它会自动递增

对于create fresh create new table 查询

CREATE TABLE `users` (
    ID int NOT NULL AUTO_INCREMENT,
    user_id varchar(255) NOT NULL AUTO_INCREMENT,
    user varchar(255),
    code text,
    PRIMARY KEY (ID)
);

这是插入查询

"INSERT INTO `users` (`user`, `code`) VALUES ('Alice', NULL);"

【讨论】:

  • 我知道。那是样本数据。这不是我问的
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2016-04-03
  • 2019-12-29
  • 2011-10-09
  • 2016-09-27
  • 1970-01-01
相关资源
最近更新 更多