web-dev-qa-db-ja.com

Oracle SQL 12c複合主キーで複合外部キーを正しく使用するにはどうすればよいですか?

免責事項:私は学生です。私は航空会社で働いていません。私はプロのプログラマであるふりをしません。

こんにちは、これらのテーブルが連携するために何を修正する必要があるかを理解したいと思います。それは明白だと確信していますが、私にはわかりません。私には、列が正しく一致しているようです。複合主キーの一部として複合外部キーを使用することと関係があると確信していますが、これを修正する方法がわかりません。多くの「TODO」が残っている私の完全なコードは、Github Gist here にあります。

現時点ではOracle DBMSにアクセスできず、数日間アクセスできないので、SQLFiddleを使用しています。これは、SQLPlusまたはDeveloperが提供できる完全な出力を提供しません。また、12cを勉強しているので最適ではありませんが、SQLFiddleは11gのサポートしか提供していません。よろしくお願いします。

これはSQLフィドルのエラー出力です。

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

そして、これは互いに一致しない2つのテーブルです。

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)
);
5
NonCreature0714

ORA-02256:参照列の数は参照列と一致する必要があります

原因:外部キー参照リストの列数が、参照リストの列数と等しくありません。
Action:参照する列が参照される列と一致することを確認してください。

問題は、外部キーが複合主キーで使用される両方の列を参照する必要があることです。

FLIGHT_DATE列をRESERVATIONSテーブルに追加し、コードを変更します。

CONSTRAINT FK_reservations_flight_ID FOREIGN KEY (FLIGHT_ID)
    REFERENCES FLIGHT(FLIGHT_ID,FLIGHT_DATE)
);

に:

CONSTRAINT FK_reservations_flight_ID FOREIGN KEY (FLIGHT_ID,FLIGHT_DATE)
    REFERENCES FLIGHT(FLIGHT_ID,FLIGHT_DATE)
);
4
JSapkota