【问题标题】:SQL Error: ORA-00922: missing or invalid optionSQL 错误:ORA-00922:缺少或无效选项
【发布时间】:2012-01-15 05:19:31
【问题描述】:
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 和 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:

【问题讨论】:

  • 表名中不能有空格。
  • 有空格是不好的做法,但是如果你真的想在表名中有空格,你需要用双引号括起来。这将导致以后更多的麻烦。然而,说 TABLE NAME CANNOT HAVE SPACES 的声明并不完全正确。这有效:创建表“我爱空间”(space_id 整数,chartered_flight CHAR(10))

标签: sql database oracle oracle-sqldeveloper


【解决方案1】:

您遇到的错误似乎是表名中“chartered”和“flight”之间没有下划线的结果。我假设你想要这样的东西,其中表的名称是 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 约束 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_atdestination 都是机场代码,您确实应该有一个单独的有效机场代码表,并在chartered_flight 表和这个新的airport_code 表之间定义外键约束。这样可以确保只添加有效的机场代码,并且在将来机场代码更改时更容易。

从命名约定的角度来看,由于 takeoff_atdestination 都是机场代码,我建议名称是互补的并表明这一事实。例如,departure_airport_codearrival_airport_code 这样的东西会更有意义。

【讨论】:

  • 很好的信息非常有趣,但看到机场代码是我刚刚添加的,而不是在课程作业规范中,你认为我应该添加吗?我将不得不更改我的 ERD 以匹配。在创建表期间,我应该在哪里添加 CHECK 约束?
  • @JatinderSingh - 我添加了一个在表定义中声明CHECK 约束的示例(您也可以随后在单独的ALTER TABLE 命令中添加它们)。如果您要这样做,我的偏见始终是正确地做某事,如果您要将机场代码添加到 chartered_flight 表中,则需要添加附加表。但是,很明显,您可以决定要在作业中投入多少工作,教师是否会关心,以及额外的工作是否有助于您学习任何东西。
  • 好吧,我打算为机场代码实施单独的表格,那么这两个如何链接?如何在机场关系中制作一列机场代码的出发机场代码和到达外键?
  • 包机和机场之间的关系也是多对多类型的吗?需要解决吗? @贾斯汀洞穴
  • @JatinderSingh - 您可以让airport_code 成为新airport 表的主键,并在departure_airport_codearrival_airport_code 列上创建外键约束,或者您可以创建在名为airport_idairport 表上生成序列生成的主键,将chartered_flight 中的列定义为departure_airport_idarrival_airport_id,并创建外键约束。 airport_id 方法更通用,但如果机场代码更像是永远不会真正改变的州代码,则使用代码作为密钥更实用。
【解决方案2】:

在命名数据库对象时不应使用空格字符。尽管可以使用双引号(带引号的标识符)CREATE TABLE "chartered flight" ...,但不建议这样做。仔细看看here

【讨论】:

    【解决方案3】:

    这样使用 CHAR 并没有什么问题。 我认为您的问题是您的表名中有一个空格。应该是:charteredflightchartered_flight..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多