Oracle SQL 12c 如何在复合主键中正确使用复合外键?
Oracle SQL 12c How to correctly use compound foreign keys in compound primary keys?
免责声明:我是一名学生。我不在航空公司工作。我不假装是专业程序员。
您好,我想了解我需要更正哪些内容才能使这些表格协同工作。我敢肯定这很明显,但对我来说不是。对我来说,看起来我正在正确匹配我的列。我确定这与使用复合外键作为我的复合主键的一部分有关 - 但我不知道如何更正此问题。我的完整代码,还有许多 'TODOs' 仍然存在,在 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)
);
我明白了。我需要一个唯一的主键,而不是由 table 中的外键组成 - 我不必稍后在输出中显示它,但我需要 select 唯一的行。更新如下,效果很好。
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)
);
免责声明:我是一名学生。我不在航空公司工作。我不假装是专业程序员。
您好,我想了解我需要更正哪些内容才能使这些表格协同工作。我敢肯定这很明显,但对我来说不是。对我来说,看起来我正在正确匹配我的列。我确定这与使用复合外键作为我的复合主键的一部分有关 - 但我不知道如何更正此问题。我的完整代码,还有许多 'TODOs' 仍然存在,在 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)
);
我明白了。我需要一个唯一的主键,而不是由 table 中的外键组成 - 我不必稍后在输出中显示它,但我需要 select 唯一的行。更新如下,效果很好。
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)
);