2011-12-07 26 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

有空格是不好的做法,但如果你真的想在表名中有一個空格,你需要用雙引號括起來。這會在以後導致更多麻煩。然而,表名不能有空格的說法並不完全正確。 這工作: 創建表的「我愛的空間」 (space_id整數,chartered_flight CHAR(10)) – abhi

回答

4

您遇到的錯誤似乎是表名中「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)不會強制有三個字符的(有用)數據。它只是告訴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就會更有意義。

+0

好的信息是非常有趣的,但看到作爲機場代碼的事情只是由我並沒有在課程規範添加你我想我應該加入?我將不得不改變我的ERD來匹配。我在哪裏添加CHECK約束是在表創建期間? –

+0

@JatinderSingh - 我添加了一個向表定義聲明'CHECK'約束的例子(你也可以在單獨的'ALTER TABLE'命令中添加它們)。如果你打算這樣做,那麼我的偏見總是會做得正確,如果你要將機場代碼添加到'chartered_flight'表中,就需要添加額外的表。但是,很明顯,您需要確定自己想要投入任務的工作量,教練是否在意,以及額外的工作是否可以幫助您學習任何東西。 –

+0

好的,我說要爲機場代碼實施單獨的表格,那麼這兩者如何聯繫?機場關係中的一個列airport_code的departure_airport_code和抵達外鍵嗎? –

1

沒有什麼錯誤使用CHAR這樣.. 我覺得你的問題是,你有你的表名的空間。它應該是:charteredflightchartered_flight ..

2

命名數據庫對象時,不應該使用空格字符。儘管可以使用雙引號(帶引號的標識符),CREATE TABLE "chartered flight" ...,但並不推薦。仔細觀察here

相關問題