2017-09-15 120 views
1

此查询有什么问题?Oracle SQL中缺少关键字

我收到以下错误:

ORA-00905: missing keyword
00905. 00000 - "missing keyword"

我的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 
); 
+0

'ORA-00905:缺少关键字00905. 00000 - “缺少关键字”'整个消息?是否还有行号? –

+2

注释掉你所有的约束。尝试创建表格。放下桌子,然后再次尝试添加一个约束。注意你的逗号和右括号。 –

+0

从一开始就有一个“错误始于行:641 in命令 - ”。 – ANDIII324

回答

1

根据文档:CREATE TABLE
没有on DELETE RESTRICT选项,只有CASCADE或​​是允许的,
请参阅下面附加的语法图: enter image description here


我想你想从父表中的行删除,以防止在当有在引用这个父行的子表行 - 如果是的话,完全跳过ON DELETE条款,因为这是外键约束的默认行为。

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

Error report - ORA-02264: name already used by an existing constraint 02264. 00000 - "name already used by an existing constraint" *Cause: The specified constraint name has to be unique. *Action: Specify a unique constraint name for the constraint.

该错误消息说,该约束的名字之一,你已经使用在创建表中已经装好(使用)并且不能再次使用它。
我想你没有向我们展示整个错误消息,因为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

+0

我运行的代码没有ON DELETE,但仍然,它给了我一个错误消息。 – ANDIII324

+1

您是否收到相同的错误讯息?我在没有ON DELETE的情况下运行你的语句,并得到另一个错误ORA-00942:表或视图不存在,因为在我的数据库中不存在被引用的表 - 这意味着语法现在是正确的。 – krokodilko

+0

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