Как ОБНОВИТЬ только одну запись в DB2? - PullRequest
4 голосов
/ 05 января 2012

В DB2 мне нужно сделать SELECT FROM UPDATE, чтобы поместить обновление + выбор в одну транзакцию.
Но мне нужно убедиться, что обновить только одну запись на транзакцию.

Знаком с предложением LIMIT из MySQL UPDATE опция

устанавливает ограничение начисло строк, которые можно обновить

Я искал что-то похожее в DB2 UPDATE ссылка , но безуспешно.

Как можно добиться чего-то подобного вDB2?


Редактировать: В моем сценарии я должен предоставить 1000 кодов купонов по запросу.Мне просто нужно выбрать (любой) тот, который еще не был дан.

Ответы [ 2 ]

4 голосов
/ 08 января 2012

Вопрос использует некоторую двусмысленную терминологию, которая делает неясным, что должно быть достигнуто.К счастью, 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 будет возвращать данные только из измененных строк.

2 голосов
/ 05 января 2012

У вас есть два варианта.Как отмечает Лошадь без имени , вы можете использовать первичный ключ таблицы, чтобы обеспечить обновление одной строки за раз.

Альтернатива, если вы используетеЯзык программирования и контроль над курсорами заключается в использовании курсора с параметром «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 на вашем хост-языке, вам нужно выполнить ручную бэширование, чтобы найтиэквивалентный механизм.

...