在没有主键的情况下建立两个表之间的关系 - 外键关系(ORACLE)

时间:2016-05-04 13:24:04

标签: sql oracle relational-database foreign-key-relationship

我有以下两个表:

客房:

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 - "此列列表没有匹配的唯一或主键"

     

*原因:CREATE / ALTER TABLE语句中的REFERENCES子句              给出一个没有匹配的唯一或主要列的列表              引用表中的键约束。

     

*操作:使用ALL_CONS_COLUMNS查找正确的列名称              目录视图

是否有任何方法可以在不使用primary / foreingn键的情况下在COD_RoomType列上建立两个表之间的关系?如果是这样,我必须做什么其他修改以及SQL代码是什么样的?

谢谢你, 克林

1 个答案:

答案 0 :(得分: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.

但是,在大多数情况下,最好根据引用表的PK添加FK,而不是对引用表中的代码进行反规范化