【问题标题】:How to get currently inserted AUTO_INCREMENT id?如何获取当前插入的 AUTO_INCREMENT id?
【发布时间】:2014-06-05 00:28:50
【问题描述】:

我有以下表结构。

我想在插入新记录时为item_image_name 插入与item_id 相同的值(这是AUTO_INCREMENT)。

编辑 我在插入时想要这个

INSERT INTO items(user_id, item_image_name) VALUES ('','LAST_INCREMENT_VALUE + 1')

【问题讨论】:

  • 先插入然后获取最后插入的id和item_image_name的更新值
  • 如果不进行插入,您将无法获得下一个 id。如果您只检查下一个 id 将是什么,则存在插入之前插入其他内容的风险。
  • @AwladLiton 我知道这种方法.. 我只是想知道我可以在插入时进入单个 INSERT 语句.. INSERT INTO items(user_id, item_image_name) VALUES ('','LAST_INCREMENT_VALUE + 1')
  • 但老实说,我不知道为什么你有 item_image_name 如果它总是 id。只需删除该字段即可。

标签: php mysql sql


【解决方案1】:

您可以通过在表上定义before insert 触发器来实现此目的。
在正文中,首先您可以找到要分配给主键字段的下一个自动增量值,并将其用于image_name 字段。

示例

delimiter //

drop trigger if exists bi_on_items //

create trigger bi_on_items before insert on items
for each row
begin
  if NEW.item_image_name is null OR length( trim( NEW.item_image_name ) ) = 0 then
    set NEW.item_image_name := ( SELECT AUTO_INCREMENT 
                                   FROM INFORMATION_SCHEMA.TABLES
                                  WHERE TABLE_NAME = 'items'
                                    AND TABLE_SCHEMA = DATABASE() );

  end if;
end;
//

delimiter ;

【讨论】:

  • 似乎是一个很好的解决方案......但遗憾的是我无法理解这一点......我是 MySQL 触发器的新手 :(
  • 您可以要求澄清。
  • 在此之前,还要查看我回答的a similar posting
【解决方案2】:

您可以使用 mysql_insert_id() 来获取当前连接上最后插入的 id。

【讨论】:

  • 我知道,但请再次阅读我的问题...我在问一些不同的问题
【解决方案3】:

mysql_insert_id — 获取上次查询生成的 ID

【讨论】:

    【解决方案4】:
    $id = mysqli_insert_id();
    

    应该使用它来代替 mysql_insert_id(),因为 PHP 5.5 原生 MySQL 驱动程序已被弃用。

    【讨论】:

      【解决方案5】:

      简短的回答:你不能。自动增量 ID 仅在成功插入时生成。所以在插入过程中你将无法访问它。

      替代方法是先进行插入,然后使用 mysql_insert_id() 获取最后一个 id,然后使用检索到的 id 更新同一行。

      PS:您应该停止使用 mysql_* 函数,因为在 v5.5 之后正式弃用。尽快切换到 PDO 或 mysqli。

      【讨论】:

      • 是的,我使用过这种方法,首先插入,然后获取 LAS_INSERT_ID,然后更新同一行以输入 ITEM_IMAGE_NAME 的值。我只是在想是否有任何 MySQL 函数可以获取最后一个增量PRIMARY_KEY 的那个表
      • 正如我所说,在插入过程中或插入之前,您无法知道自增列的值
      【解决方案6】:

      你可以这样试试:

      先插入,然后获取最后插入的 id 并更新 item_image_name 的值

      $mysqli = new mysqli("localhost", "my_user", "my_password", "db");
      
      if (mysqli_connect_errno()) {
          printf("Connect failed: %s\n", mysqli_connect_error());
          exit();
      }
      
      
      $query = "your insert query";// insert with all fields and set item_image_name to empty
      
      
       if( $mysqli->query($query)){
      
          $id= $mysqli->insert_id;
          $query = "UPDATE your_table set item_image_name= '$id' where item_id = $id LIMIT 1 ";//now update the value of item_image_name
          $mysqli->query($query);
          }
      

      使用MYSQLI_*PDO 不要使用mysql_*,因为mysql_* 已被弃用。

      【讨论】:

        【解决方案7】:

        使用

        $sid=mysql_insert_id();
        

        我插入第一行 $sid 应该是 1

        插入下一个使用$sid+1

        编辑

        对于您的问题: 编写查询以获取最后一个 item_id 并使用该 id + 1 填充当前的 item_image_name

        注意:对于新项目item_iditem_image_name 应该相同。

        【讨论】:

          【解决方案8】:

          你可以使用

          SHOW TABLE STATUS LIKE 'tablename' 获取下一个自动递增的 id。

          $result = mysql_query("SHOW TABLE STATUS LIKE 'table_name'");
          $row = mysql_fetch_array($result);
          $nextId = $row['Auto_increment'];   
          

          然后在插入查询中使用变量 $nextId

          INSERT INTO items(user_id, item_image_name) VALUES ('',$nextId)
          

          【讨论】:

          • 使用此方法时查看 WizKid 的评论
          【解决方案9】:

          你用的是什么mysql驱动?

          如果您使用的是 mysql 驱动程序,那么您将获得最后插入的 ID 为 mysql_insert_id();

          对于 PDO 驱动程序:PDO::lastInsertId();

          注意:从 PHP 5.5 (http://php.net/manual/en/migration55.deprecated.php) 开始,mysql 驱动程序已被弃用

          【讨论】:

          • 不是 OP 的要求
          【解决方案10】:

          首先获取最后插入的 id。

          select item_id as lastId from items order by id desc limit 0,1
          

          现在在您的查询中使用 lastId。

          INSERT INTO items(user_id, item_image_name) VALUES ('','lastId+1')
          

          希望这会有所帮助。

          【讨论】:

            【解决方案11】:

            您可以在选择查询中使用插入

            INSERT INTO items(user_id, item_image_name) VALUES ('','SELECT MAX(item_id)+1 FROM items') 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-01-21
              • 2013-03-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-06-02
              相关资源
              最近更新 更多