2017-09-15 470 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