Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL错误:ORA-00922:缺少或无效选项_Sql_Database_Oracle_Oracle Sqldeveloper - Fatal编程技术网

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

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_

我应该不使用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_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 )
)