很抱歉,如果这是一个骗局 - 我搜索了类似的问题,但它们似乎都是条件更新,你可以使用CASE语句将列设置为多个值中的一个。
我有一个SQL UPDATE语句,但有两个原因让我不希望它更新:
我想以某种方式区分这两种状态,这就是为什么我不能把条件放在WHERE子句中。
目前看起来像这样:
UPDATE MY_TABLE t
SET t.TITLE = :TITLE,
t.TYPE = :TYPE,
t.STATE = :STATE,
t.UPDTIME = :UPDTIME
WHERE t.ITEM_ID = :ITEM_ID
AND exists (SELECT t.ITEM_ID
FROM MY_TABLE t, USERINFO ui
WHERE ui.USERID = t.USERID
AND ui.USERNAME = :USERNAME
AND t.ITEM_ID = :ITEM_ID);
如果它找到(并更新)MY_TABLE
中与给定USERNAME和ITEM_ID匹配的项目,则返回1,如果没有,则返回0。
我想添加一些内容,以便在t.STATE = 'READ_ONLY'
时不会更新,但这样做可以将该条件区分为"该项目没有"存在"条件。也许抛出某种错误?
我可以在更新之前运行SELECT
语句,以确保项目的状态不是READ_ONLY,但这似乎很浪费。还有更好的方法吗?
答案 0 :(得分:1)
我不认为以前的SQL会浪费它。抛出一个错误只是为了捕捉一个条件(如果你的真实更新抛出相同的除以零错误会怎么样?)。您可以选择更新,然后通过rowid更新它,以便在您使用堆表时加快速度:
SELECT t.ITEM_ID, t.condition, t.rowid
FROM MY_TABLE t, USERINFO ui
WHERE ui.USERID = t.USERID
AND ui.USERNAME = :USERNAME
AND t.ITEM_ID = :ITEM_ID for update;
如果满足您的条件,您只需按rowid更新表格
update MY_TABLE
set ...
where rowid = :rowid