抱歉,这是骗人的-我搜索了类似的问题,但它们似乎都符合条件更新的原则,您可以在其中使用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。
我想添加一些内容,以便它不会在if时更新t.STATE = 'READ_ONLY'
,但是为了使该条件与“该项目不存在”条件区分开来。也许抛出某种错误?
我可以SELECT
在更新前运行一条语句,以确保该项目的状态不是READ_ONLY,但这似乎很浪费。有没有更好的办法?
我认为先前的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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句