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:
答案 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_flight
和airport_code
都是机场代码,我建议这些名称是互补的并表明这一事实。例如,像takeoff_at
和destination
之类的东西会更有意义。
答案 1 :(得分:2)
命名数据库对象时不应使用空格字符。尽管可以使用双引号(带引号的标识符)CREATE TABLE "chartered flight" ...
,但不建议这样做。仔细看看here
答案 2 :(得分:1)
像这样使用CHAR没有任何问题。
我认为你的问题是你的tablename中有一个空格。它应该是:charteredflight
或chartered_flight
..