2016-05-15 126 views
-1

我有這個表中獲取最後插入的ID,以MySQL表多西:如何插入後,主鍵

Id1 Id2 Id3 Id4 Name 

1  1  1  1  test 
1  1  1  2  test2 
1  2  1  1  test 
1  2  1  2  test2 

ID4爲:

CREATE TABLE `test` (
    `Id1` int(11) unsigned NOT NULL, 
    `Id2` int(11) unsigned NOT NULL, 
    `Id3` int(11) unsigned NOT NULL, 
    `Id4` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `Name` varchar(255) NOT NULL, 
    PRIMARY KEY (`Id1`,`Id2`,`Id3`,`Id4`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; 

INSERT INTO `test` (`Id1`, `Id2`, `Id3`, `Name`) VALUES (1, 1, 1, 'test') 
INSERT INTO `test` (`Id1`, `Id2`, `Id3`, `Name`) VALUES (1, 1, 1, 'test2') 
INSERT INTO `test` (`Id1`, `Id2`, `Id3`, `Name`) VALUES (1, 2, 1, 'test') 
INSERT INTO `test` (`Id1`, `Id2`, `Id3`, `Name`) VALUES (1, 2, 1, 'test2') 

創建日期看起來像這樣的表格之後按預期增加,但我有問題,使用PHP mysqli插入Id4。這是我使用的代碼:

$db = new mysqli('host', 'user', 'pass', 'db'); 
$db->query("INSERT INTO `test` (`Id1`, `Id2`, `Id3`, `Name`) VALUES (1, 1, 1, 'test')"); 
var_dump($db->insert_id); 

我得到的結果

int(0) 

的結果應該是int(1)但我得到零無緣無故。有任何想法嗎?

+0

您可以添加'AUTO_INCREMENT = 1'在2002年底'創建table'(之後 '動態'),並給它一個新的嘗試? – Jeff

+0

@ Fred-ii-但這正是他剛剛做的,對他不起作用......或者我錯過了什麼?他正在使用面向對象風格,這與您剛剛爲程序風格發佈的內容是同義的。 – Poiz

+1

@ Fred-ii-:他確實有一個具有AUTO_INCREMENT屬性的列,對嗎? – Jeff

回答

1

本質上,你的代碼應該工作......它在測試時工作......換句話說,檢查是否有其他事情正在進行......因爲它代表着,你的代碼是可以的......並且應該做工精細...但是作爲替代變通,你可能想包裝MySQL的LAST_INSERT_ID()函數在自己的函數,然後調用函數時,你需要獲得最後插入ID ...

<?php 

    // WILL RETURN THE ID OF THE AUTO-INCREMENTED FIELD ONLY 
    function getLastInsertID($db, $tbl='test'){ 
     $result = null; 
     $sql = $db->prepare("SELECT LAST_INSERT_ID() FROM `". $tbl ."`"); 
     $sql->execute(); 
     $sql->bind_result($result); 
     $sql->fetch(); 
     return $result; 
    } 
    var_dump(getLastInsertID($db)); 

也許它爲你的絕招....

REF:http://dev.mysql.com/doc/refman/5.7/en/getting-unique-id.html

+0

mysqli API函數有什麼問題? –

+0

@YourCommonSense只有常識,男人!有時它可能非常罕見 – Poiz

+0

謝謝。這解決了我的問題。 $ mysqli-> insert_id返回0,而實際的SQL請求返回正確的值。看起來API函數確實有問題。 – sajushko

0

LAST_INSERT_ID()僅爲聲明爲AUTO_INCREMENT的列返回值。沒有函數返回系統未生成的複合主鍵中的值。你應該知道這個值,因爲你只是在INSERT語句中給出它。棘手的情況是,當一個觸發器或某個東西覆蓋了這個值。

更多細節: Check this stackoverflow link

+0

Id4是AUTO_INCREMENT – sajushko

+0

請試試InnoDB。希望它會有所幫助。 –

+0

引擎不是問題。 mysqli_insert_id函數有問題。該函數返回0,而實際的LAST_INSERT_ID()請求返回正確的值。 – sajushko