在 DB2 中,我需要执行SELECT FROM UPDATE
,在单个事务中添加更新+选择。
但我需要确保每个事务只更新一条记录。
熟悉MySQL's UPDATE
选项
LIMIT
子句
对可以更新的行数设置限制
我在DB2's UPDATE
reference中寻找类似的东西但没有成功。
如何在DB2中实现类似的东西?
编辑:在我的方案中,我必须根据要求提供1000个优惠券代码。我只需要选择(任何)尚未给出的那个。
答案 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从
SELECT
,UPDATE
或INSERT
语句支持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,你必须进行手动抨击才能找到等效的机制。