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

Jat*_*ngh 3 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)
Run Code Online (Sandbox Code Playgroud)

我不应该使用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:
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 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)
Run Code Online (Sandbox Code Playgroud)

通常,将列声明为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 )
)
Run Code Online (Sandbox Code Playgroud)

由于takeoff_atdestination都是机场代码,因此您确实应该有一个单独的有效机场代码表,并在该chartered_flight表和此新airport_code表之间定义外键约束。这样可以确保仅添加有效的机场代码,并且如果将来更改机场代码,将使其更加容易。

从命名约定的角度来看,由于takeoff_atdestination都是机场代码,因此我建议名称是互补的,并表示这一事实。诸如departure_airport_code和之类的东西arrival_airport_code会更有意义。