使用auto_increment插入表中,但将其他列作为LAST_INSERT_ID返回

时间:2017-04-07 12:21:04

标签: mysql

我有一个带有自动递增主键的表。我想在其中插入一行,但返回其他内容为LAST_INSERT_ID。阅读手册,我认为可以这样做:

CREATE TABLE test (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    number BIGINT
);

INSERT INTO test (number) VALUES (LAST_INSERT_ID(50));

SELECT LAST_INSERT_ID();

我希望它返回50,但它返回1。

documentation表示:

  

mysql_insert_id()的返回值可以简化为以下顺序:

     
      
  1. 如果有AUTO_INCREMENT列,并且已成功插入自动生成的值,则返回第一个这样的值。

  2.   
  3. 如果语句中出现LAST_INSERT_ID(expr),则返回expr,即使受影响的表中有AUTO_INCREMENT列。

  4.   
  5. 返回值因使用的语句而异。在INSERT语句之后调用时:

         
        
    • 如果表中有AUTO_INCREMENT列,并且此列的某些显式值已成功插入表中,则返回最后一个显式值。
    •   
         

    在INSERT ... ON DUPLICATE KEY UPDATE语句后调用:

         
        
    • 如果表中有AUTO_INCREMENT列,并且有一些显式成功插入的值或某些更新的值,则返回最后插入或更新的值。
    •   
  6.   

如果我正确地解释了 2。,我的查询应该有效,应该返回50而不是1.但它看起来像点 1。在点 2 的

有没有其他方法可以实现这一点而无需运行多个查询?

1 个答案:

答案 0 :(得分:0)

LAST_INSERT_ID() - 最后一次INSERT的AUTOINCREMENT列的值
(为AUTO_INCREMENT列成功插入的自动生成的值),
它来自this页面。

这意味着您可以使用此功能:

CREATE TABLE test (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    number BIGINT
);

INSERT INTO test (number) VALUES (200);

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+

INSERT INTO test (number) VALUES (100);

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+

可是:

INSERT INTO test VALUES (50, 50);

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+

select * from test;
+----+--------+
| id | number |
+----+--------+
|  1 |    200 |
|  2 |    100 |
| 50 |     50 |
+----+--------+

因为id 50不是由mysql生成的......