Создать таблицу с внешним ключом для другой таблицы, созданной ниже в файле sql - PullRequest
1 голос
/ 23 апреля 2020

Моя проблема в том, что у меня есть две таблицы, каждая из которых имеет внешний ключ к другой таблице. Каждый раз, когда я выполняю файл SQL, содержащий создание двух таблиц, выдает ошибку, что он не находит другую таблицу. Я работаю с sqlplus для выполнения файла sql. Вот пример файла SQL, с которым я пытался:

create table A(
Age number(3),
name number(3) constraint A_FK references B(name))
/
create table B(
Age number(3) constraint B_FK references A(Age),
name number(3))

И даже если я изменил порядок, он выдает ту же ошибку. Спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 23 апреля 2020

Это проблема циклов во внешних ключах. Один из способов - добавить все внешние ключи после создания таблицы (как я полагаю в других ответах).

Вы также можете просто сделать это для первой таблицы:

create table A (
    Age number(3) primary key,
    name number(3)
);

create table B (
    name number(3) primary key,
    Age number(3),
    constraint B_FK foreign key (age) references A(Age)
);

alter table B add constraint A_FK foreign key (name) references B(name);

Здесь - это db <> fiddle.

Примечания:

  • Внешние ключи должны ссылаться на первичные ключи, поэтому я также добавил это объявление.
  • I рекомендуем сделать первичный ключ первым столбцом в таблице.
  • Вы также можете определить встроенное ограничение для одной из таблиц (т. е. age number(3) constraint b_fk references a(age)).
0 голосов
/ 23 апреля 2020

Сначала создайте таблицу, а затем ДОБАВЬТЕ ОГРАНИЧЕНИЕ

ALTER TABLE A
ADD FOREIGN KEY (name) REFERENCES B(name);

ALTER TABLE B
ADD FOREIGN KEY (age) REFERENCES A(age);
0 голосов
/ 23 апреля 2020

Столбец (столбцы) таблицы, на который ссылается внешний ключ, должен существовать во время создания ограничения. Поскольку у вас есть какая-то циклическая ссылка c между таблицами, вам нужно сделать это в три этапа:

  • сначала создать одну таблицу без внешнего ключа

  • создать вторую таблицу (с ее внешним ключом)

  • наконец добавить внешний ключ к первой таблице с помощью оператора alter table

В указанном столбце также необходимо установить ограничение уникального или первичного ключа, иначе вы получите ошибку ORA-02270: no matching unique or primary key for this column-list.

create table A(
    age number(3) primary key,
    name number(3) 
);

create table B(
    age number(3) constraint B_FK references A(Age),
    name number(3) primary key
);

alter table A add constraint A_FK foreign key (name) references B(name);

Демонстрация на DB Fiddle

Примечание: я весьма подозрительно отношусь к вашей структуре выборки, но это может быть потому, что вы упростили ее в вопросе.

0 голосов
/ 23 апреля 2020

Сбой, потому что справочная таблица еще не существует.

Сначала создайте таблицы без ключа. Затем бросьте один и воссоздайте его со ссылкой. Затем бросьте 2-й и создайте его заново со ссылкой.

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