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