SQL错误:ORA-00922:缺少或无效选项
我应该不使用CHAR数据类型吗 我听说使用它是一种不好的做法,但我想让它至少有3个字符,因为它们是机场代码 这就是我得到的错误:SQL错误:ORA-00922:缺少或无效选项,sql,database,oracle,oracle-sqldeveloper,Sql,Database,Oracle,Oracle Sqldeveloper,我应该不使用CHAR数据类型吗 我听说使用它是一种不好的做法,但我想让它至少有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_
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没有什么错。。
我认为你的问题是你的表名中有一个空格。它应该是:
charteredflight
或chartered\u flight
。您得到的错误似乎是由于表名中的“chartered”和“flight”之间没有下划线。我假设您想要这样的东西,其中表名为chartered\u flight
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:
通常,将列声明为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
, destination CHAR (3) NOT NULL)
由于起飞地点和目的地都是机场代码,因此您确实应该有一个单独的有效机场代码表,并在包机表和新的机场代码表之间定义外键约束。这将确保只添加有效的机场代码,并使将来机场代码更改时变得更加容易
从命名惯例的角度来看,由于起飞地点和目的地都是机场代码,我建议两个名称相互补充并表明这一事实。例如,像
出发\机场\代码
和到达\机场\代码
,将更有意义 命名数据库对象时不应使用空格字符。即使可以使用双引号(带引号的标识符),创建表“chartered flight”…
,也不推荐使用。仔细看一看表名中不能有空格。使用空格是一种不好的做法,但如果确实想在表名中有空格,则需要将其用双引号括起来。这将导致以后更多的麻烦。然而,说表名不能有空格的语句并不完全正确。这是可行的:创建表“我爱空间”(space_id integer,chartered_flightchar(10))不错的信息非常有趣,但鉴于机场代码只是由我添加的,而不是在课程规范中,你认为我应该添加它吗?我必须改变我的ERD来匹配。在创建表的过程中,我应该在哪里添加检查约束?@JatinderSingh-我添加了一个示例,向表定义中声明CHECK
约束(您也可以在单独的ALTER table
命令中添加它们)。我的偏见是,如果你要做某件事,就必须正确地去做。如果你要将机场代码添加到包机航班表中,就必须添加额外的表。但是,很明显,你要决定你想在一项作业中投入多少工作,讲师是否会关心,以及额外的工作是否有助于你学习任何东西。好吧,假设我将实施机场代码的单独表格,那么这两个表将如何联系?我是否在机场关系中设置了一列机场代码的起飞\机场\代码和到达外键?图表航班和机场之间的关系是否也是多对多类型的?需要解决吗@贾斯廷Cave@JatinderSingh-您可以让airport\u code
作为新airport
表的主键,并在出发机场\u code
和到达机场\u code
列上创建外键约束,也可以在airport
表上创建序列生成的主键调用airport\u id
,将chartered\u flight
中的列定义为exchange\u airport\u id
和arrival\u airport\u id
,并创建外键约束。airport\u id
方法更为通用,但如果机场代码更像是从未真正改变的州代码,那么使用代码作为关键更为实用。
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 )
)