1. ホーム
  2. sql

[解決済み] SQLエラーです。ORA-00922: オプションがないか無効です。

2022-02-03 12:20:32

質問

CREATE TABLE chartered flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL
, destination CHAR (3) NOT NULL)

CHARデータ型は使わない方が良いですか?

しかし、takeoff_atとdestinationは空港コードなので、最低3文字必要なのです。

これは私が得ているエラーです。

Error at Command Line:1 Column:23
Error report:
SQL Error: ORA-00922: missing or invalid option
00922. 00000 -  "missing or invalid option"
*Cause:    
*Action:

解決方法は?

このエラーは、テーブル名の "chartered" と "flight" の間にアンダースコアがないことが原因であるように思われます。 テーブルの名前は次のようなものだと思います。 chartered_flight .

CREATE TABLE chartered_flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL
, destination CHAR (3) NOT NULL)

一般に、カラムを以下のように宣言することにメリットはありません。 CHAR(3) よりも VARCHAR2(3) . カラムを CHAR(3) は、3文字の(有用な)データを強制するものではありません。 ただ、3文字未満のデータを3文字にスペースパッドするよう、Oracleに指示するだけです。 これでは、誰かがうっかり間違ったコードを入力してしまったときに、役に立つとは思えません。 可能性としては、カラムを次のように宣言することができます。 VARCHAR2(3) を追加し、さらに CHECK という制約があります。 LENGTH(takeoff_at) = 3 .

CREATE TABLE chartered_flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL CHECK( length( takeoff_at ) = 3 )
, destination CHAR (3) NOT NULL CHECK( length( destination ) = 3 )
)

というのは、どちらも takeoff_atdestination が空港コードである場合、有効な空港コードのテーブルを別に用意して chartered_flight テーブルと、この新しい airport_code テーブルを作成します。 これにより、有効な空港コードのみが追加されるようになり、将来的に空港コードが変更された場合にも、より簡単に対応できるようになりました。

また、命名規則の観点から、両方の takeoff_atdestination が空港コードである場合、名前を補完し、その事実を示すようにすることを提案します。 例えば departure_airport_codearrival_airport_code などの方がよっぽど意味がある。