【问题标题】:Oracle SQL 12c How to correctly use compound foreign keys in compound primary keys?Oracle SQL 12c 如何在复合主键中正确使用复合外键?
【发布时间】:2016-05-07 00:20:39
【问题描述】:

免责声明:我是一名学生。我不为航空公司工作。我不假装自己是专业的程序员。

您好,我想了解我需要更正什么才能使这些表格协同工作。我确信这很明显,但对我来说不是。对我来说,看起来我正确匹配了我的列。我确信这与使用复合外键作为复合主键的一部分有关——但我不知道如何纠正这个问题。我的完整代码(还有许多“待办事项”)在 Github Gist here 上。

我目前无权访问 Oracle DBMS,而且有好几天都无法访问,所以我正在使用 SQLFiddle;这并不能提供 SQLPlus 或 Developer 可以提供的完整输出。它也不是最优的,因为我正在学习 12c,但 SQLFiddle 只提供 11g 支持。提前谢谢你。

这是 SQL fiddle 的错误输出:

ORA-02256: number of referencing columns must match referenced columns

这是两个不一致的表。

CREATE TABLE FLIGHT (
  FLIGHT_ID NUMBER(3),
  AIRCRAFT_ID VARCHAR(8),
  FLIGHT_DATE DATE,
  CONSTRAINT PK_flight_comp_pk PRIMARY KEY (FLIGHT_ID,FLIGHT_DATE),
  CONSTRAINT FK_flight_route_ID FOREIGN KEY (FLIGHT_ID)
    REFERENCES FLIGHT_ROUTE(ROUTE_ID),
  CONSTRAINT FK_flight_serial_ID FOREIGN KEY (AIRCRAFT_ID)
    REFERENCES AIRCRAFT(AIRCRAFT_ID)
);

CREATE TABLE RESERVATIONS (
  CUSTOMER_ID NUMBER(4),
  FLIGHT_ID NUMBER(3),
  QTY_RESERVED_SEATS NUMBER(3),
  CONSTRAINT PK_reservations PRIMARY KEY (CUSTOMER_ID,FLIGHT_ID),
  CONSTRAINT FK_reservations_customer_ID FOREIGN KEY (CUSTOMER_ID)
    REFERENCES CUSTOMER(CUSTOMER_ID),
  CONSTRAINT FK_reservations_flight_ID FOREIGN KEY (FLIGHT_ID)
    REFERENCES FLIGHT(FLIGHT_ID,FLIGHT_DATE)
);

【问题讨论】:

    标签: sql primary-key foreign-key-relationship oracle12c compound-key


    【解决方案1】:

    我想通了。我需要一个唯一的主键,而不是由表中的外键组成 - 我不必稍后在输出中显示它,但我需要选择唯一的行。更新如下,效果很好。

    CREATE TABLE FLIGHT (
      FLIGHT_ID NUMBER(5),
      ROUTE_ID NUMBER (3),
      AIRCRAFT_ID VARCHAR(8),
      FLIGHT_DATE DATE,
      CONSTRAINT PK_flight_comp_pk PRIMARY KEY (FLIGHT_ID),
      CONSTRAINT FK_flight_route_ID FOREIGN KEY (ROUTE_ID)
        REFERENCES FLIGHT_ROUTE(ROUTE_ID),
      CONSTRAINT FK_flight_serial_ID FOREIGN KEY (AIRCRAFT_ID)
        REFERENCES AIRCRAFT(AIRCRAFT_ID)
    );
    
    CREATE TABLE RESERVATIONS (
      RESERVATIONS_ID NUMBER (6),
      CUSTOMER_ID NUMBER(4),
      FLIGHT_ID NUMBER(5),
      QTY_RESERVED_SEATS NUMBER(3),
      CONSTRAINT PK_reservations PRIMARY KEY (RESERVATIONS_ID),
      CONSTRAINT FK_reservations_customer_ID FOREIGN KEY (CUSTOMER_ID)
        REFERENCES CUSTOMER(CUSTOMER_ID),
      CONSTRAINT FK_reservations_flight_ID FOREIGN KEY (FLIGHT_ID)
        REFERENCES FLIGHT(FLIGHT_ID)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2017-07-22
      • 1970-01-01
      • 2018-04-07
      • 2022-11-21
      • 1970-01-01
      相关资源
      最近更新 更多