【问题标题】:Missing keyword in Oracle SQLOracle SQL 中缺少关键字
【发布时间】:2018-02-24 20:53:25
【问题描述】:

这个查询有什么问题?

我收到以下错误:

ORA-00905:缺少关键字
00905. 00000 - “缺少关键字”

我的 SQL:

CREATE Table ORDERDET
(
    ORDERID NUMBER,
    CUSTID NUMBER,
    PRODID NUMBER,
    ORDPRIORITY VARCHAR2(15),
    ORDDISCOUNT NUMBER(3,2),
    ORDSHIPMODE VARCHAR2(15),
    ORDDATE DATE,
    ORDSHIPDATE DATE,
    ORDSHIPCOST NUMBER(5,2),
    ORDQTY NUMBER,
    ORDSALES NUMBER(7,2),

    CONSTRAINT ch_ORDPRIORITY 
         CHECK (ORDPRIORITY IN ('Low', 'Medium', 'High',    'Critical', 'Not Specified')),
    CONSTRAINT ch_ORDSHIPMODE 
        CHECK (ORDSHIPMODE IN ('Regular Air','Delivery Truck','Express Air')),
    CONSTRAINT pk_ORDERDET 
        PRIMARY KEY (ORDERID, CUSTID, PRODID),

    CONSTRAINT fk_ORDERD 
        FOREIGN KEY (ORDERID) REFERENCES ORDERS (ORDERID) on DELETE RESTRICT,
    CONSTRAINT fk_CUSTOMERORDER 
        FOREIGN KEY (CUSTID) REFERENCES CUSTOMERS (CUSTID) on DELETE RESTRICT,
    CONSTRAINT fk_PRODUCTORDER 
        FOREIGN KEY (PRODID) REFERENCES PRODUCTS (PRODID) on DELETE RESTRICT
);

【问题讨论】:

  • ORA-00905: missing keyword 00905. 00000 - "missing keyword" 是整个消息吗?不是也有行号吗?
  • 注释掉所有约束。尝试创建表。删除表并再次尝试一次添加一个约束。注意逗号和右括号。
  • 从一开始就只有一个“错误从行:641 in command -”开始。

标签: sql oracle


【解决方案1】:

根据文档:CREATE TABLE
没有on DELETE RESTRICT 选项,只允许使用CASCADESET NULL
请参见下面附上的语法图:


我猜你想防止在子表中有行引用此父行的情况下删除父表中的行 - 如果是,则完全跳过 ON DELETE 子句,因为这是默认值外键约束的行为。

---------- 编辑 ----------

错误报告 - ORA-02264:名称已被现有约束使用 02264. 00000 - “名称已被现有约束使用” *原因:指定的约束名称必须是唯一的。 *行动:指定一个 约束的唯一约束名称。

错误消息说,您在创建表中使用的约束名称之一已经被创建(使用)并且您不能再次使用它。
我认为您没有向我们展示整个错误消息,因为 Oracle 应该打印这个重复的名称。
无论如何,您可以使用此查询找到重复的名称:

select *
from user_objects
where object_name in (
'CH_ORDPRIORITY' ,
'CH_ORDSHIPMODE' ,
 'PK_ORDERDET' ,
'FK_ORDERD' ,
'FK_CUSTOMERORDER' ,
'FK_PRODUCTORDER'
)

如果这些名称中的一个(或几个)已被使用,则使用不同的名称,例如 FK_PRODUCTORDER_11 而不是 FK_PRODUCTORDER

【讨论】:

  • 我在没有 ON DELETE 的情况下运行代码,但它仍然给我一条错误消息。
  • 您是否收到相同的错误消息?我在没有ON DELETE 的情况下运行您的语句并得到另一个错误ORA-00942: table or view does not exist,因为我的数据库中不存在引用的表 - 这意味着语法现在是正确的。
  • 错误报告 - ORA-02264:名称已被现有约束 02264 使用。00000 -“名称已被现有约束使用” *原因:指定的约束名称必须是唯一的。 *Action:为约束指定一个唯一的约束名称。
  • 我已经编辑了我的问题,附加了新错误原因的解释,以及如何管理它。
  • 谢谢!表终于创建好了。但是,我仍然不确定一件事:为什么添加 ON DELETE RESTRICT 会显示为“缺少关键字”的错误类型
猜你喜欢
  • 2012-09-26
  • 2016-11-09
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多