Стараться избегать-803 в DB2 вставляет

Я пытаюсь вставить одну строку, которая может или не может уже существовать. Я хотел бы постараться не выбирать его сначала и/или получать-803, если это действительно существует. Я провел некоторое исследование и попробовал и игнорирую и оператор слияния, но продолжаю получать синтаксические ошибки на обоих. В любом случае я не пробую, копируют данные из другой таблицы - так, слияние не является действительно соответствующим.
Нет ли некоторый путь в DB2 SQL, чтобы просто выпустить отказоустойчивую вставку и не иметь для кодирования вокруг этого? Другими словами, есть ли, некоторые вставляют синтаксис, который гарантирует, что данные будут добавлены, если они не будут существовать, или возврат обнулит состояние даже они, они делают?

5
задан Mike GH 13 January 2010 в 17:36
поделиться

2 ответа

Короче говоря, ответ нет. В течение длительного времени все зависит от ограничений, которые вы настроили на вашем столе. Если вы пытаетесь выполнить вставку против таблицы, которая имеет уникальное ограничение в столбце, и данные уже существуют, что вы пытаетесь вставить, вы получите ошибку в DB2 (и любых других RDBMS).

В этом случае ваш лучший вариант, вероятно, написать сохраненную процедуру, которая проверяет, существует ли запись перед его созданием.

2
ответ дан 18 December 2019 в 14:46
поделиться

MERGE подходит , поскольку вы можете динамически указывать значения в предложении USING (см. Пример 5 в http: // publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0010873.htm).

Но MERGE - это функция DB2 V8.2! Вы, вероятно, используете V8.1, не так ли?

Если вы реализуете проверку существования следующим образом:

SELECT
if (found) UPDATE else INSERT

остерегайтесь проблем параллелизма: два параллельных потока могут оба не найти столбца, а затем оба попытаются вставить, даже если есть транзакция вокруг вышеуказанного кода. Чтобы этого не произошло, вам необходимо получить блокировку обновления с помощью Repeatable Read в приведенном выше операторе SELECT, используя WITH RR USE AND KEEP UPDATE LOCKS .

7
ответ дан 18 December 2019 в 14:46
поделиться