Вкратце (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.
Вопрос: Вы знаете, известная ли это ошибка или странная функция? Или я что-то упускаю? Поиск в Интернете пока не помог.