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)
您收到的错误似乎是由于表名称中的“特许”和“飞行”之间没有下划线引起的。我假设您想要这样的表名称是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_at
和destination
都是机场代码,因此您确实应该有一个单独的有效机场代码表,并在该chartered_flight
表和此新airport_code
表之间定义外键约束。这样可以确保仅添加有效的机场代码,并且如果将来更改机场代码,将使其更加容易。
从命名约定的角度来看,由于takeoff_at
和destination
都是机场代码,因此我建议名称是互补的,并表示这一事实。诸如departure_airport_code
和之类的东西arrival_airport_code
会更有意义。