Php Laravel:插入后最后一次插入的ID()是0?

Php Laravel:插入后最后一次插入的ID()是0?,php,mysql,laravel-5,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-&g

我有以下工作查询:

$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;
officechnr
具有唯一的主索引
['jahr','monat']
zahl
是一个带有
自动增量的
索引

因此,如果表
officeechnr
为空,并且我执行代码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


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

简短回答:选择最后一次插入\u ID()在第一次插入时不起作用(参见下面的示例)。而是使用
\DB::getPdo()->lastInsertId()


为什么
选择最后一次插入\u ID()
在第一次插入时不起作用

其声明如下:

在没有参数的情况下,LAST_INSERT_ID()返回一个BIGINT UNSIGNED(64位) 表示自动生成的第一个值的值 由于以下原因,已成功插入自动增量列: 最近执行的INSERT语句

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

例如:

将表格
test
成像如下:

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

返回

三十三

数组('SELECT_LAST_INSERT_ID()'=>0)

用同样的方法

$sql = 'INSERT INTO test (  name ) VALUES ("Eba")';
返回

一,

数组('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\u LAST\u INSERT\u ID()
为0,因为AI密钥不是自动生成的,尽管表中的ID是
1
。它对序列号有效的原因是

如果expr作为LAST_INSERT_ID()的参数提供,则 参数由函数返回,并作为下一个参数存储 最后一个插入ID()返回的值


为什么不改用
DB::insert
?另外,您正在为
zahl
输入值,为什么要将其设置为自动增量字段?@user2693053我不能使用
DB::insert
,因为我想使用
DB::raw
。将
zahl
列作为
autoincrement
是必要的,这样
LAST\u INSERT\u ID()
将返回其值(请参见)。这是有道理的。我真的想不出发生这种情况的原因。[does状态:如果expr作为LAST_INSERT_ID()的参数提供,则该参数的值由函数返回,并作为LAST_INSERT_ID()返回的下一个值被记住这可能是一个需要考虑的问题,但我真的不知道这可能是一个问题。@ USER 2693053有趣的想法。我刚刚检查,发现问题是“代码> LaSTixEndotTyId())/代码>它与Laravel没有任何关系…我现在必须编辑我的问题。谢谢你的评论!
$stmt         = $db->prepare('INSERT INTO officeRechNr (jahr,monat,zahl) VALUES (?,?,1) ON DUPLICATE KEY UPDATE zahl = LAST_INSERT_ID(zahl+1)');