2016-05-15 85 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