以下代码:
$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 来引用该行。
在 INSERT 语句中,WHERE 子句没有意义。
插入或替换的工作方式如下:将具有指定值的记录插入到表中。如果这会导致违反 UNIQUE 约束,则会删除旧记录。
若要替换可能已存在的记录,标识该记录的列必须是要插入的值的一部分。换句话说,您必须插入rowid
值:
INSERT OR REPLACE INTO vehicle_service_invoice(rowid, ...) VALUES (1, ...)