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)');