2011-12-07 38 views
1
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データ型を使用すべきではありませんか?SQLエラー:ORA-00922:欠落しているか、または無効なオプション

私はそれを使用するのが悪い習慣だと聞いていますが、私はtakeoff_atにしたいと思っていました。目的地は空港コードなので最低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: 
+2

テーブル名にスペースを入れることはできません。 –

+0

スペースを入れるのは悪い習慣ですが、実際にテーブル名にスペースを入れたい場合は、二重引用符で囲む必要があります。後でもっと問題につながるでしょう。しかし、TABLE NAMEがスペースを持つことはできないという声明は、正確に正しいとは言えません。 これは動作します: は 「私はスペースを愛する」テーブルを作成 (space_id整数、c​​hartered_flight CHAR(10)) – abhi

答えて

4

エラーは、表名に「チャーター」と「フライ​​ト」の間にアンダースコアがないために発生しているようです。テーブルの名前が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文字になることはありません。これは、Oracleに、3文字未満の3文字のデータをスペース・パッドするように指示するだけです。誰かが誤って間違ったコードを入力した場合、それは役に立ちません。列を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のようなものは、はるかに意味があります。

+0

素敵な情報非常に興味深いが、空港コードのものとして見て私だけではなく授業仕様に追加されますを行います私はそれを追加すべきだと思いますか?私は一致するように私のERDを変更する必要があります。 CHECK制約を追加する場所は、テーブルの作成時のものですか? –

+0

@JatinderSingh - 'CHECK'制約をテーブル定義に宣言する例を追加しました(後で別の' ALTER TABLE'コマンドで追加することもできます)。私の偏見は、もしあなたが 'chartered_flight'テーブルに空港コードを追加しようとするならば、追加のテーブルを追加する必要があるなら、常に正しく何かをすることでしょう。しかし、教師が気にするかどうか、余分な仕事が何かを学ぶのに役立つかどうかは、あなたが課題にどれくらいの時間を割きたいかを決定することは明らかです。 –

+0

OK空港コードのために別のテーブルを実装するつもりだったとしたら、どのように2つのリンクがありますか?空港の関係にある1つの列airport_codeのdeparture_airport_codeと到着の外部キーを作成しますか? –

1

をそのようにCHARを使用したと間違って何もない... 私はあなたの問題は、あなたのテーブル名にスペースを持っているということだと思います。 charteredflightまたはchartered_flight

2

データベースオブジェクトに名前を付けるときに、スペース文字を使用しないでください。二重引用符(引用符付きの識別子)を使用すると可能ですが、CREATE TABLE "chartered flight" ...は推奨されません。よく見るとhere

関連する問題