INSERT或REPLACE WHOW ROWID导致错误

时间:2013-10-27 01:05:01

标签: sqlite

以下代码:

$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.


我要做的是为我的INSERTUPDATE逻辑制作一条单独的路径,所以在我发现我能做INSERT OR REPLACE后,我想我可以根据每个项目的ROWID更新信息。对我来说,语法看起来是正确的,我做错了什么?

应该注意的是,我并不关心更改ROWID值,因为我理解这是执行INSERT OR REPLACE语句的跳闸点。基于INVOICE列的其他查询中的所有内容都会连接在一起。我只想用ROWID来引用那一行。

1 个答案:

答案 0 :(得分:1)

在INSERT语句中,WHERE子句没有意义。

INSERT OR REPLACE的工作方式如下:将具有指定值的记录插入表中。 如果这会导致违反UNIQUE约束,则删除记录。

要替换可能已存在的记录,标识该记录的列必须是要插入的值的一部分。 换句话说,您必须插入rowid值:

INSERT OR REPLACE INTO vehicle_service_invoice(rowid, ...) VALUES (1, ...)