2012-07-02 55 views
1

在phpMyAdmin現在工作:LAST_INSERT_ID()返回多行0?

order表strucure:

OrderID  int(11) auto_increment 
CustomerID varchar(50) 
BillAddr varchar(200) 
ShipAddr varchar(200) 
Date   date 
Total   double 

表目前有4行數據,用不同的OrderIDs。

SQL:

SELECT LAST_INSERT_ID() FROM `order` 

結果:

LAST_INSERT_ID() 
0 
0 
0 
0 

我期待第四行OrderID - 只是一個數字,但對於在phpMyAdmin每一行得到了一個0。

+2

不,您不能以這種方式使用此功能。 – Lion

+1

MySql'LSAT_INSERT_ID()'函數類似於PHP'mysql_insert_id()'函數。參見[this](http://stackoverflow.com/questions/10644468/retrieving-the-last-insert-id-from-mysql-using-php)和[this](http://stackoverflow.com/questions/ 10518831/insert-data-into-a-child-table-based-master-table-primary-key-values)有關更多詳細信息的問題。 – Lion

回答

6

LAST_INSERT_ID()返回最後一個插入行的id,並且不綁定到任何表。所以,如果你創建一個新的行:

INSERT INTO table VALUES('a', 'b', 'c'); 

它會返回最後的id(無論新的主鍵的值)。

SELECT LAST_INSERT_ID(); 
=> 123 

有關詳情,請看一看the manual

LAST_INSERT_ID()(無參數)返回一個表示這是用於設定第一自動生成的值的BIGINT(64位)的值AUTO_INCREMENT列使用最近執行的INSERT語句來影響這樣的列。例如,將產生一個AUTO_INCREMENT值的行後,就可以得到這樣的價值:

如果你只是想獲得最後的ID在一個表中,你可以做這樣的:

SELECT id FROM table ORDER BY id DESC LIMIT 1; 
+5

最後一個查詢返回最大的插入ID - 不是最新的。它不受約束。這兩種方法之間存在非常重要的語義差異。 (我並不是說iblue的代碼是錯誤的 - 只是假設它與last_insert_id()相同是非常危險的) – symcbean

3

the manual指出:

LAST_INSERT_ID()(無參數)表示返回這是一個設置第一自動生成的值的BIGINT(64位)的值列由最近執行INSERT聲明影響到這樣的一列。例如,將產生一個AUTO_INCREMENT值的行後,就可以得到這樣的價值:

mysql> SELECT LAST_INSERT_ID(); 
     -> 195
+0

我正在解釋這條語句,因爲它應該返回最後一個插入的最後一個auto_increment值,但是,我添加了'order',因爲我有多個表...看起來像最近執行的INSERT覆蓋 –

+2

@GregMcNulty:您應該刪除'... FROM order'(因爲它只會導致評估LAST_INSERT_ID()的結果相同)一次在'order'表中的每個記錄返回,這不是你想要的)。你應該在執行一個INSERT語句後立即運行產生的SELECT LAST_INSERT_ID();查詢(如上面的引用所示)。如果這不符合您的要求,請提供更多詳細信息。 – eggyal

1

做這樣的:

INSERT INTO `one`(`id`, `name`) VALUES (NULL,'shivam'); 
select last_insert_id(); 

執行插入他們之後沒有其他查詢兩者應該一起執行

0

我有同樣的問題,解決方案是在同一時間做查詢。換句話說,第一個查詢和第二個(last_insert_id)查詢應該同時執行。不是兩個不同的執行。

0

通過指示一個表,您可以重複所述表中每行的select語句。

它不會影響您的查詢結果,除了重複相同的值。

如果在phpmyadmin中運行,您可能需要檢查Persistent Connections是否設置爲TRUE,否則由於LAST_INSERT_ID(),您總是會收到0。