2017-04-07 30 views
0

我有一个带有自动递增主键的表。我想插入一行,但返回其他内容为LAST_INSERT_ID。阅读手册,我认为这是可能的:使用auto_increment插入到表中,但将其他列作为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. 如果在语句中发生LAST_INSERT_ID(expr),则返回expr,即使受影响的表中存在AUTO_INCREMENT列。

  3. 返回值因使用的语句而异。当一个INSERT语句之后调用:

    • 如果表中的一个AUTO_INCREMENT列,并有成功插入到表中此列一些明确的值,返回最后一个明确的价值观。

    当插入后调用... ON DUPLICATE KEY UPDATE语句:如果表中的一个AUTO_INCREMENT列,并有一些明确的成功插入值或更新一些值

    • ,返回最后一个插入或更新的值。

如果我正确地解释点2.,我的查询应该工作,应该返回50,而不是1,但它看起来像点1.先点2.

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

回答

0

LAST_INSERT_ID() - 最后INSERT
(成功插入一个AUTO_INCREMENT列自动生成的值)AUTOINCREMENT列的值,
它是从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 | 
+----+--------+ 

这是因为标识50不是由MySQL的产生......

+0

我知道正常使用'LAST_INSERT_ID()'。但是我使用'LAST_INSERT_ID(expr)',它是一个返回'expr' _的函数,并且同时将当前会话的last_insert_id设置为'expr'_。通常的例子是:'UPDATE表SET数字= LAST_INSERT_ID(数字+ 1);''增加'数字'并且同时返回值为'last_insert_id'。 请参阅:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id – user147133

+0

但无论如何,你的例子很有趣。不知道。 – user147133

相关问题