2012-04-24 96 views
4

有人可以解釋MySQL函數LAST_INSERT_ID()是如何工作的。我試圖獲取數據庫中最後插入的行的ID,但每次都得到1.SELECT LAST_INSERT_ID()

我使用mybatis。

實施例的查詢是:

<insert id="insertInto" parameterType="Something" timeout="0"> 
    INSERT INTO something (something) VALUES (#{something}) 
    <selectKey resultType="int"> 
    SELECT LAST_INSERT_ID() 
    </selectKey> 
</insert> 

代碼:

System.out.println("Id : " + id) 

輸出:

Id : 1 
+1

是您的ID定義爲'autoincrement'? – j0k 2012-04-24 08:20:06

+1

id是自動增量 – Staba 2012-04-24 08:23:02

+0

它也可能是[id在對象中注入](http://stackoverflow.com/a/12106243/1504300)類似發生在我身上的情況,又名「你讀得不好文檔「。 – reallynice 2017-01-04 13:14:33

回答

5
LAST_INSERT_ID() 

是每個用戶和每個連接。

你可以在MySQL doc瞭解更多。

+1

+1爲每個用戶提供和每個連接 – DonBecker 2013-03-21 18:22:54

8

LAST_INSERT_ID返回上一個值隱含插入到當前會話的AUTO_INCREMENT列中。

CREATE TABLE mytable (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value INT NOT NULL); 

要使列自動增量,則應該從INSERT列表中忽略它:

INSERT 
INTO mytable (value) 
VALUES (1) 

或給它提供一個NULL值:

INSERT 
INTO mytable (id, value) 
VALUES (NULL, 1) 

之後,

SELECT LAST_INSERT_ID() 

將返回值AUTO_INCREMENT已插入id列。

如果這是行不通的:

  1. 您提供的AUTO_INCREMENT
  2. 您在另一個會話
  3. 您插入在同一個語句多行調用LAST_INSERT_ID明確的值(LAST_INSERT_ID()會返回插入的第一行的值,而不是最後一行)。
+0

也許mybatis創建兩個會話,我將嘗試創建一個查詢插入並選擇在一個...謝謝 – Staba 2012-04-24 08:39:04

0

我沒有使用過MyBatis的,但你的東西插入到表後,請檢查AUTO_INCREMENT值被以下MySQL查詢更新時間:

SELECT Auto_increment FROM (SHOW TABLE STATUS LIKE '<table-name>') as A; 

另外,還要確保你有沒有明確的價值,你給auto_increment字段。你需要讓DB爲自己設置它。

這裏有一些其他的東西,你可以嘗試:

  1. 請務必閱讀的結果爲整數。 This顯示了一個類似的情況,需要顯式轉換爲Int32。

  2. 如果你正在做多個插入,知道只有第一個插入的元組的ID被視爲LAST_INSERT_ID。根據this(搜索use test)。

0

我有兩個解決方案後,實現了大量複雜我瞭解第二個...... 我會告訴你,第二是更好的... 這很簡單...只是在查詢插入此keyProperty="id" 這樣子: <insert id="insertInto" parameterType="Something" keyProperty="id" timeout="0"> INSERT INTO something (something) VALUES (#{something}) </insert> 查詢返回插入行的ID 謝謝!

-1

您必須使用表名來選擇最後一個插入ID。

例子:

SELECT LAST_INSERT_ID() FROM my_table; 
+1

這隻會調用LAST_INSERT_ID()每一行my_table – Braiba 2012-12-07 14:12:09

0

例1:

mysql> CREATE TABLE prime2 LIKE prime; 
Query OK, 0 rows affected (0.08 sec) 

mysql> SELECT LAST_INSERT_ID(); //From table prime!!! 
+------------------+ 
| LAST_INSERT_ID() | 
+------------------+ 
|    3 | 
+------------------+ 
1 row in set (0.00 sec) 


mysql> INSERT INTO prime2 VALUES(1,1); 
Query OK, 1 row affected (0.01 sec) 

mysql> SELECT LAST_INSERT_ID(); 
+------------------+ 
| LAST_INSERT_ID() | 
+------------------+ 
|    3 | 
+------------------+ 
1 row in set (0.00 sec) //From table prime!!!