我有以下代码:
$add_rq = $DBH->prepare('INSERT INTO `table` SET `url` = :url ON DUPLICATE KEY UPDATE `url`=`url`');
if($add_rq->execute(['url' => $url]))
echo "Added (id: ".$DBH->lastInsertId().")";
else
echo "Not added";
如果表中已存在插入url
,ON DUPLICATE KEY UPDATE
语句有效,但execute()
的返回值始终为TRUE
。但是在这种情况下lastInsertId()
为零。我可以使用它作为插入重复的指示,或者我可以在插入之前再向DB执行一次查询,但这两种方法对我来说都很糟糕。
还有更好的方法吗?
答案 0 :(得分:1)
您可以使用$add_rq->rowCount()
。根据{{3}}中的评论,如果插入了新行,则会返回1
,如果现有行已更新,则会2
。但显然这是错误的,如果更新了一行,它会返回0
。
execute()
仅在因错误而失败时才返回false。
答案 1 :(得分:0)
如果ID重复,则更新ID
然后lastInsertId()
将在更新后返回id(而不是0)
它将在插入后以任意方式返回id
INSERT INTO `table` SET `url` = :url ON DUPLICATE KEY UPDATE `url`=`url`, id=LAST_INSERT_ID(id)
现在即使没有插入新行,也会返回id
$DBH->lastInsertId()
要查明是否有插入更新,您可以添加另一个名为“updated”的列,默认值为0,然后在更新时应将列设置为1
INSERT INTO `table` (`url`) VALUES (?) ON DUPLICATE KEY UPDATE `url`=?, `updated`=`updated`+1
来源:它在mysql手册http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.htm的底部提到了 MySQL ON DUPLICATE KEY - last insert id?