我有以下工作查询:
$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']
,而zahl
是index
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。
为什么我的Laravel代码在第一次插入后没有返回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()返回的值。