Пытался иметь рекурсивное отношение - PullRequest
0 голосов
/ 11 января 2020

Я использую oracle и пытаюсь создать рекурсивное отношение

CREATE TABLE  "EVENT"
(
    "EVENT_ID" NUMBER(18) NOT NULL, //primary key
    "NAME" VARCHAR(20) NULL,
    "RELATED_EVENT_ID" NUMBER(18) NULL  //foreign key
);

Родителем события 1 является событие 2 ....

Когда я пытаюсь создать эту таблицу, я получите эту ошибку.

ALTER TABLE  "EVENT" 
 ADD CONSTRAINT "FK_RELATED_EVENT_ID"
FOREIGN KEY ("RELATED_EVENT_ID") REFERENCES  "EVENT" ("RELATED_EVENT_ID")
Error report -
SQL Error: ORA-02270: no matching unique or primary key for this column-list
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
           gives a column-list for which there is no matching unique or primary
           key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS
           catalog view

Ответы [ 2 ]

1 голос
/ 11 января 2020

У вас есть две проблемы:

  1. В этой таблице нет ограничений первичного ключа.
  2. Заданное вами ограничение внешнего ключа имеет RELATED_EVENT_ID ссылку на RELATED_EVENT_ID. Я подозреваю, что это была просто опечатка.

Измените определение вашей таблицы на:

CREATE TABLE EVENT
 (EVENT_ID            NUMBER
    NOT NULL
    CONSTRAINT PK_EVENT
      PRIMARY KEY
      USING INDEX,
    NAME              VARCHAR2(20),
    RELATED_EVENT_ID  NUMBER);

Затем добавьте ограничение внешнего ключа как

ALTER TABLE EVENT
  ADD CONSTRAINT EVENT_FK1
    FOREIGN KEY (RELATED_EVENT_ID) REFERENCES EVENT(EVENT_ID);

db <> fiddle here

EDIT

Обратите внимание, что лучший способ справиться с этим - использовать соединительную таблицу, например:

CREATE TABLE EVENT_EVENT
 (EVENT_ID1    NUMBER
    CONSTRAINT EVENT_EVENT_FK1
      REFERENCES EVENT(EVENT_ID),
  EVENT_ID2    NUMBER
    CONSTRAINT EVENT_EVENT_FK2
      REFERENCES EVENT(EVENT_ID),
  CONSTRAINT PK_EVENT_EVENT
    PRIMARY KEY (EVENT_ID1, EVENT_ID2)
      USING INDEX);

Тогда Вы можете удалить столбец RELATED_EVENT_ID из EVENT, так как он вам больше не нужен.

1 голос
/ 11 января 2020

Согласно oracle документу :

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

В вашем случае создайте primary key для столбца (EVENT_ID) и используйте его в предложении reference следующим образом:

ALTER TABLE  "EVENT" 
 ADD CONSTRAINT "FK_RELATED_EVENT_ID"
FOREIGN KEY ("RELATED_EVENT_ID") 
  REFERENCES  "EVENT" ("EVENT_ID") -- this

Теперь используйте EVENT2 EVENT_ID в качестве RELATED_EVENT_ID в EVENT1 записи для создания EVENT2 в качестве родителя EVENT1 .

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...