以下代码:
$stm = $sql->prepare('INSERT OR REPLACE INTO "vehicle_service_invoice" (
invoice, "date", unit, odometer, sublet, sub, po, categories
) VALUES (
:invoice, :date, :unit, :odometer, :sublet, :sub, :po, :categories
) WHERE rowid = :rowid;'
);
$stm->bindParam(':invoice', $_POST['invoice']);
$stm->bindParam(':date', $_POST['date']);
$stm->bindParam(':unit', $_POST['unit']);
$stm->bindParam(':odometer', $_POST['odometer']);
$stm->bindParam(':sublet', $_POST['sublet']);
$stm->bindParam(':sub', $_POST['sub']);
$stm->bindParam(':po', $_POST['po']);
$stm->bindParam(':categories', $categories);
$stm->bindParam(':rowid', $_POST['rowid']);
$stm->execute();
生成以下查询:
INSERT OR REPLACE INTO "vehicle_service_invoice" (
invoice,
"date",
unit,
odometer,
sublet,
sub,
po,
categories
) VALUES (
7230,
'2013-02-07',
558,
34863,
0,
0,
1486347,
5
) WHERE rowid = 1
这会产生以下错误:
ERROR: near "WHERE": syntax error.
我要做的是为我的INSERT
和UPDATE
逻辑制作一条单独的路径,所以在我发现我能做INSERT OR REPLACE
后,我想我可以根据每个项目的ROWID
更新信息。对我来说,语法看起来是正确的,我做错了什么?
应该注意的是,我并不关心更改ROWID
值,因为我理解这是执行INSERT OR REPLACE
语句的跳闸点。基于INVOICE
列的其他查询中的所有内容都会连接在一起。我只想用ROWID来引用那一行。
答案 0 :(得分:1)
在INSERT语句中,WHERE子句没有意义。
INSERT OR REPLACE的工作方式如下:将具有指定值的记录插入表中。 如果这会导致违反UNIQUE约束,则删除旧记录。
要替换可能已存在的记录,标识该记录的列必须是要插入的值的一部分。
换句话说,您必须插入rowid
值:
INSERT OR REPLACE INTO vehicle_service_invoice(rowid, ...) VALUES (1, ...)