如何更新DB2中的一条记录?

时间:2012-01-04 23:09:29

标签: mysql database transactions db2

DB2 中,我需要执行SELECT FROM UPDATE,在单个事务中添加更新+选择。
但我需要确保每个事务只更新一条记录

熟悉MySQL's UPDATE选项

中的LIMIT子句
  

对可以更新的行数设置限制

我在DB2's UPDATE reference中寻找类似的东西但没有成功。

如何在DB2中实现类似的东西?


编辑:在我的方案中,我必须根据要求提供1000个优惠券代码。我只需要选择(任何)尚未给出的那个。

2 个答案:

答案 0 :(得分:4)

这个问题使用了一些含糊不清的术语,使得不清楚需要完成什么。幸运的是,DB2为各种SQL模式提供了强大的支持。

限制UPDATE修改的行数:

UPDATE 
( SELECT t.column1 FROM someschema.sometable t WHERE ... FETCH FIRST ROW ONLY
) 
SET column1 = 'newvalue';

UPDATE语句永远不会看到基表,只是过滤它的表达式,因此您可以控制更新哪些行。

<小时/> 要INSERT有限数量的新行:

INSERT INTO mktg.offeredcoupons( cust_id, coupon_id, offered_on, expires_on )
SELECT c.cust_id, 1234, CURRENT TIMESTAMP, CURRENT TIMESTAMP + 30 DAYS 
FROM mktg.customers c 
LEFT OUTER JOIN mktg.offered_coupons o
ON o.cust_id = c.cust_id
WHERE ....
AND o.cust_id IS NULL
FETCH FIRST 1000 ROWS ONLY;

<小时/> 这就是DB2从SELECTUPDATEINSERT语句支持DELETE的方式:

SELECT column1 FROM NEW TABLE (
    UPDATE ( SELECT column1 FROM someschema.sometable 
             WHERE ... FETCH FIRST ROW ONLY
    ) 
    SET column1 = 'newvalue'
) AS x;

SELECT将仅从修改后的行返回数据。

答案 1 :(得分:2)

您有两种选择。如A Horse With No Name所述,您可以使用表的主键来确保一次更新一行。

另一种方法是,如果你使用编程语言并控制游标,则使用带有'FOR UPDATE'选项的游标(虽然这可能是可选的; IIRC,游标默认为'FOR UPDATE'当底层的SELECT意味着它可以是),然后在UPDATE语句中使用带有WHERE CURRENT OF <cursor-name>的UPDATE语句。这将更新光标当前寻址的一行。语法的详细信息因您使用的语言而异,但原始SQL如下所示:

DECLARE CURSOR cursor_name FOR
    SELECT *
      FROM SomeTable
     WHERE PKCol1 = ? AND PKCol2 = ?
       FOR UPDATE;

UPDATE SomeTable
   SET ...
 WHERE CURRENT OF cursor_name;

如果你不能用你的主语言编写DECLARE,你必须进行手动抨击才能找到等效的机制。