Laravel:插入后LAST_INSERT_ID()为0?

时间:2017-11-22 12:21:26

标签: php mysql laravel-5

我有以下工作查询:

$year         = 2019;
$month        = 6;
$stmt         = $db->prepare('INSERT INTO officeRechNr (jahr,monat,zahl) VALUES (?,?,1) ON DUPLICATE KEY UPDATE zahl = LAST_INSERT_ID(zahl+1)');
$stmt->bind_param('ii', $year, $month);
$stmt->execute();
echo $db->insert_id;

officeRechNr具有唯一的主索引['jahr','monat'],而zahlindex autoincrement

因此,如果表officeRechNr为空,并且我执行代码5次,则输出为

  

1,2,3,4,5

我尝试用Laravel 5翻译这个

\DB::select(DB::raw('INSERT INTO officeRechNr (jahr,monat,zahl) VALUES (?,?,1) ON DUPLICATE KEY UPDATE zahl = LAST_INSERT_ID(zahl+1)'),[2019,6]);

return DB::select('SELECT LAST_INSERT_ID()');

但是,如果我执行此代码5次,我会

  

0,2,3,4,5

虽然在第一次插入后返回0,但zahl列中有1。

enter image description here

为什么我的Laravel代码在第一次插入后没有返回1?

1 个答案:

答案 0 :(得分:1)

简答:SELECT_LAST_INSERT_ID()不适用于第一次插入(参见下面的示例)。而是使用\DB::getPdo()->lastInsertId();

为什么SELECT_LAST_INSERT_ID()无法在第一次插入时使用

在此处陈述:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

  

没有参数,LAST_INSERT_ID()返回BIGINT UNSIGNED(64位)   表示第一个自动生成的值的值   已成功插入AUTO_INCREMENT列作为结果   最近执行的INSERT语句。

自动生成意味着自动列自行增加,而不是由我设置。

示例:

像这样写一张表test

CREATE TABLE test (
       id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
       name VARCHAR(10) NOT NULL
       );

现在

$sql = 'INSERT INTO test ( id, name ) VALUES (33, "ADAM")';
$db->query($sql);
echo $db->insert_id;
$result =  $db->query('SELECT LAST_INSERT_ID()');
$row = $result->fetch_assoc();
print_r($row);

返回

  

33

     

array('SELECT_LAST_INSERT_ID()'=> 0);

做同样的事情
$sql = 'INSERT INTO test (  name ) VALUES ("Eba")';

返回

  

1

     

array('SELECT_LAST_INSERT_ID()'=> 1);

所以在第一个声明中:

$stmt         = $db->prepare('INSERT INTO officeRechNr (jahr,monat,zahl) VALUES (?,?,1) ON DUPLICATE KEY UPDATE zahl = LAST_INSERT_ID(zahl+1)');

SELECT_LAST_INSERT_ID()为0,因为AI键不是自动生成,尽管表中的ID为1。它适用于后续数字的原因是

  

如果expr作为LAST_INSERT_ID()的参数给出,则该值为   参数由函数返回,并作为下一个记住   LAST_INSERT_ID()返回的值。