MERGE и ON DELETE CASCADE в Oracle XE 10g - PullRequest
       36

MERGE и ON DELETE CASCADE в Oracle XE 10g

4 голосов
/ 31 марта 2012

Короче говоря (tl; dr): при попытке удалить строки во время MERGE Oracle 10g, похоже, игнорирует операторы ON DELETE CASCADE для внешних ключей.Я хотел бы знать, если это известная ошибка, функция (по-видимому, прекращена в 11g), или что.

Подробнее:Мне кажется, что в Oracle XE 10g попытка удалить строки из таблицы в операторе MERGE приводит к ошибке ORA-02292 (нарушение ссылочной целостности) всякий раз, когда существует внешний ключ, ссылающийся натаблица назначения слияния, даже если в ограничении внешнего ключа было указано ON DELETE CASCADE.Например, скажем, я создал три таблицы

CREATE TABLE Mysource(
  MykeyS NUMBER,
  MystringS VARCHAR2(10),
  CONSTRAINT Mysource_PK PRIMARY KEY(MykeyS) ENABLE
);

CREATE TABLE Mydest(
  MykeyD NUMBER,
  MystringD VARCHAR2(10),
  CONSTRAINT Mydest_PK PRIMARY KEY(MykeyD) ENABLE
);

CREATE TABLE Myother(
  Mykey NUMBER,
  Mydate DATE,
  CONSTRAINT Myother_FK FOREIGN KEY(Mykey)
  REFERENCES Mydest(MykeyD) ON DELETE CASCADE ENABLE
);

и вставил в них некоторые данные, затем попробуйте

MERGE INTO Mydest D
USING Mysource S
ON (D.MykeyD=S.MykeyS)
WHEN MATCHED THEN
UPDATE SET D.MystringD = S.MystringS
DELETE WHERE (S.MykeyS > 10)
WHEN NOT MATCHED THEN
INSERT (MykeyD, MystringD)
VALUES (S.MykeyS, S.MystringS)
WHERE (S.MykeyS <= 10)

Если в Mydest и Myother было несколько строк с> 10ключ, попытка MERGE привела бы к ORA-02292, заявляя о нарушении ограничения Myother_FK.Это звучит нелогично для меня (я могу удалить строки из Mydest, используя прямое DELETE, но не с MERGE?), И на самом деле это, похоже, не происходит с Oracle XE 11g.

Вопрос: Знаете ли вы, это известная ошибка или странная особенность?Или я что-то упустил, может быть?Пока что поиск в интернете не очень помог.

1 Ответ

2 голосов
/ 11 апреля 2012

В Oracle она указана как ошибка 8268746 в 10.2.0.3. Это исправлено в 11.2. Этот документ не доступен для внешних ссылок, но он предоставляет тестовый пример, аналогичный примеру, приведенному в вопросе выше. Обходной путь - не использовать оператор слияния (или обновить его до 11.2).

...