2013-10-27 28 views
0

以下代码:插入或替换WHERE ROWID导致错误

$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

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

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

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

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