Oracle SQL中缺少关键字

时间:2017-09-15 15:50:04

标签: sql oracle

此查询有什么问题?

我收到以下错误:

  

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
);

1 个答案:

答案 0 :(得分:1)

根据文件:CREATE TABLE
没有on DELETE RESTRICT选项,只允许CASCADESET NULL,请参阅下面附带的语法图: enter image description here

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

<强> ---------- 编辑 ----------

  

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

错误消息显示,您在create table中使用的约束名称之一已经被创建(使用过),并且您无法再次使用它。
我认为您还没有向我们展示整个错误消息,因为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