Ошибка ограничения MERGE в таблице, на которую ссылаются сами - PullRequest
0 голосов
/ 15 января 2019

MERGE вызывает ошибку

ORA-02291: integrity constraint violated-parent key not found

при вставке в таблицу с собственной ссылкой. Если я немного изменю запрос, он будет работать.

Я что-то не так делаю.

Порядок исполнения:

  1. Подготовительные материалы
  2. Первый запрос MERGE (не будет работать)
  3. Второй запрос MERGE (будет работать)

Порядок столбцов в запросе MERGE не имеет значения. Вы также можете запустить второй MERGE перед первым.

Если вы хотите перезапустить тест, начните с DROP TABLE TGR.

Сначала немного подготовки:

DROP TABLE SRC;
CREATE TABLE SRC (
  ID VARCHAR(20) PRIMARY KEY,
  PARENT VARCHAR(20)
);

INSERT INTO SRC SELECT '1', null FROM DUAL;
INSERT INTO SRC SELECT '2', '1' FROM DUAL;

DROP TABLE TRG;
CREATE TABLE TRG (
  ID VARCHAR(20) PRIMARY KEY,
  PARENT VARCHAR(20),
  CONSTRAINT FK2 FOREIGN KEY(PARENT) REFERENCES TRG(ID)
);

Это не будет работать:

MERGE INTO TRG t USING(
  SELECT PARENT, ID FROM SRC
) s ON (t.ID=s.ID)
WHEN NOT MATCHED THEN INSERT(ID,PARENT) VALUES (s.ID,s.PARENT);

Но это будет работать.

MERGE INTO TRG t USING(
  SELECT ID, PARENT FROM SRC
) s ON (t.ID=s.ID)
WHEN NOT MATCHED THEN INSERT(ID,PARENT) VALUES (s.ID,s.PARENT);

Если вы измените тип данных этих столбцов на NUMBER, он будет работать.

DROP TABLE SRC;
CREATE TABLE SRC (
  ID NUMBER PRIMARY KEY,
  PARENT NUMBER
);

INSERT INTO SRC SELECT 1, null FROM DUAL;
INSERT INTO SRC SELECT 2, 1 FROM DUAL;

DROP TABLE TRG;
CREATE TABLE TRG (
  ID NUMBER PRIMARY KEY,
  PARENT NUMBER,
  CONSTRAINT FK2 FOREIGN KEY(PARENT) REFERENCES TRG(ID)
);

MERGE INTO TRG t USING(
  SELECT PARENT, ID FROM SRC
) s ON (t.ID=s.ID)
WHEN NOT MATCHED THEN INSERT(ID,PARENT) VALUES (s.ID,s.PARENT);

Edit: Забыл сказать: я использую 12с

...