Установите связь между двумя таблицами без отношения первичный ключ - внешний ключ (ORACLE)

У меня есть две следующие таблицы:

НОМЕРА:

ID_Rooms PK number, 
RoomNumber number, 
COD_RoomType number, 
RoomPrice number,
Floor number

D_ROOMTYPE:

ID_d_RoomType PK number,
RoomType varchar2,
COD_RoomType number

В первой таблице хранится информация о гостиничных номерах, а во второй - кодификация типов номеров (двухместный номер, трехместный номер, семейный номер и т. Д.). Данные второй таблицы будут использованы для определения типов комнат в первой.

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

Я пытался:

ALTER TABLE rooms
ADD CONSTRAINT rooms_FK1 FOREIGN KEY (COD_RoomType) REFERENCES d_RoomType(COD_RoomType) enable; 

но я получаю следующий отчет об ошибке:

Отчет об ошибке:
Ошибка SQL: ORA-02270: нет соответствующего уникального или первичного ключа для этого списка столбцов 02270. 00000 - «Нет соответствующего уникального или первичного ключа для этого списка столбцов»

* Причина: предложение REFERENCES в операторе CREATE / ALTER TABLE дает список столбцов, для которого нет соответствующего ограничения уникальности или первичного ключа в указанной таблице.

* Действие: Найдите правильные имена столбцов с помощью представления каталога ALL_CONS_COLUMNS

Есть ли способ установить связь между двумя таблицами в столбце COD_RoomType без использования первичного / внешнего ключа? Если да, то какие еще изменения я должен сделать и как будет выглядеть код SQL?

Спасибо, Калин


person calin.bule    schedule 04.05.2016    source источник
comment
@calin_bule Вам понадобится третья таблица для хранения информации cod_roomtype, а затем будет внешний ключ для этой новой таблицы из таблиц rooms и d_roomtype. Однако я не совсем уверен, зачем вам это нужно - какова связь между комнатой, типом комнаты и cod_roomtype?   -  person Boneist    schedule 04.05.2016
comment
(Я должен добавить, что мое предложение добавить третью таблицу предполагает, что столбец cod_roomtype не уникален. Если это так, вы можете продолжить ответ Алексея ниже.)   -  person Boneist    schedule 04.05.2016
comment
Ограничения внешнего ключа не связывают таблицы, они обеспечивают целостность данных. Вы можете присоединиться к столам без ограничения FK.   -  person reaanb    schedule 05.05.2016
comment
@Boneist - я бы предпочел не добавлять новую таблицу, у меня их уже достаточно :)   -  person calin.bule    schedule 06.05.2016
comment
@reaab - я знаю, что таблицы можно объединять без отношения PK-FK. Я просто хочу как-то связать их так, чтобы это было видно на диаграмме БД, которую я создаю с помощью Oracle Data Modeller.   -  person calin.bule    schedule 06.05.2016
comment
У вас может не быть выбора, если вам нужна хорошо спроектированная нормализованная схема. Что означает cod_roomtype и чем он отличается от id_d_roomtype. Он уникален в D_ROOMTYPE? Если это так, добавление уникального ограничения должно помочь, согласно ответу Алексея.   -  person Boneist    schedule 06.05.2016
comment
Какие наборы столбцов таблицы содержат уникальные значения вложенных строк? Какие подчиненные строки одной таблицы должны отображаться как подчиненные строки другой таблицы (образуя зависимость включения)? Вы знаете, что означают строки и какие возможности могут возникнуть, поэтому вам нужно сообщить нам об этом. Единственные зависимости включения, которые может объявить SQL, - это те, которые ссылаются на суперключ (UNIQUE NOT NULL или PRIMARY KEY).   -  person philipxy    schedule 21.05.2016


Ответы (1)


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

SQL> CREATE TABLE rooms
  2  (
  3      ID_Rooms        NUMBER PRIMARY KEY,
  4      RoomNumber      NUMBER,
  5      COD_RoomType    NUMBER,
  6      RoomPrice       NUMBER,
  7      FLOOR           NUMBER
  8  );

Table created.

SQL> CREATE TABLE D_ROOMTYPE
  2  (
  3      ID_d_RoomType    NUMBER PRIMARY KEY,
  4      RoomType         VARCHAR2(100),
  5      COD_RoomType     NUMBER
  6  );

Table created.

SQL> ALTER TABLE D_ROOMTYPE ADD CONSTRAINT UNIQUE_COD_RoomType UNIQUE  (COD_RoomType);

Table altered.

SQL> ALTER TABLE rooms
  2  ADD CONSTRAINT rooms_FK1 FOREIGN KEY (COD_RoomType) REFERENCES d_RoomType(COD_RoomType) ENABLE;

Table altered.

Однако в большинстве случаев было бы лучше добавить FK на основе PK ссылочной таблицы, а не денормализовать код в ссылочной таблице.

person Aleksej    schedule 04.05.2016
comment
Я пробовал это, и это не сработало. Он возвращает ту же ошибку ORA-02270, что и раньше. - person calin.bule; 05.05.2016