SQL错误:ORA-00922:缺少或无效选项

时间:2011-12-07 17:24:24

标签: sql database oracle oracle-sqldeveloper

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和目的地必须至少有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:

3 个答案:

答案 0 :(得分:5)

您获得的错误似乎是表名中“特许”和“飞行”之间没有下划线的结果。我假设你想要这样的东西,其中表的名称是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的{​​{1}}约束。

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_at都是机场代码,因此您应该有一个单独的有效机场代码表,并在destination表和此新{{}之间定义外键约束1}}表。这样可以确保只添加有效的机场代码,并且如果机场代码发生变化,将来会更容易。

从命名惯例的角度来看,由于chartered_flightairport_code都是机场代码,我建议这些名称是互补的并表明这一事实。例如,像takeoff_atdestination之类的东西会更有意义。

答案 1 :(得分:2)

命名数据库对象时不应使用空格字符。尽管可以使用双引号(带引号的标识符)CREATE TABLE "chartered flight" ...,但不建议这样做。仔细看看here

答案 2 :(得分:1)

像这样使用CHAR没有任何问题。 我认为你的问题是你的tablename中有一个空格。它应该是:charteredflightchartered_flight ..