2011-11-03 107 views
3

在Oracle 9i中存在聲明FK的問題。我在這裏查看了一些例子以及一些在線文檔(例如http://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php),但沒有真正的運氣;在鏈接嘗試類似的語法來生成相同的錯誤:Oracle中的外鍵約束問題

Error at Command Line:19 Column:4 
Error report: 
SQL Error: ORA-02253: constraint specification not allowed here 
02253. 00000 - "constraint specification not allowed here" 
*Cause: Constraint specification is not allowed here in the statement. 
*Action: Remove the constraint specification from the statement. 

的SQL本身的摘錄如下所示。 「第19行」是指符合CONSTRAINT

CREATE TABLE Flight (
flight_no varchar2(10) NOT NULL, 
airplane_id varchar2(20) NOT NULL 
    CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id) 
    ON UPDATE RESTRICT ON DELETE RESTRICT, 
dept_date date NOT NULL, 
... 

開始或者,嘗試它沒有CONSTRAINT關鍵字生成約一個右括號,我似乎無法看到丟失的錯誤。 PS:我知道ON UPDATE RESTRICT是Oracle的默認行爲,但我更喜歡在任何可能的情況下明確表示。

回答

5

首先,在Oracle中,沒有ON UPDATE RESTRICTON DELETE RESTRICT選項。這些似乎在其他數據庫引擎中是有效的,但它們不在constraint syntax diagram中,並且看起來不是有效的。有一個ON DELETE子句,但只有兩個有效選項是CASCADE或​​。沒有ON UPDATE條款。

如果我們在constriant定義之前airplane_id定義的末尾添加一個逗號和卸下兩個無效條款,您的DDL應該是有效的

CREATE TABLE Flight (
    flight_no varchar2(10) NOT NULL, 
    airplane_id varchar2(20) NOT NULL, 
    CONSTRAINT flight_airplane_id_fk 
    FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id), 
    dept_date date NOT NULL, 
    <<more columns>> 
); 
+0

很好,謝謝。我引用了其他文檔(如http://www.dba-oracle.com/bk_on_delete_restrict_on_delete_no_action_tips.htm),但錯過了「RESTRICT」不是有效參數的部分。看起來'沒有任何行動',但是我仍然在嘗試使用時出現錯誤。總之,我想確保如果有小孩存在,什麼都不能刪除。 我假設'ON DELETE CASCADE'是沒有明確指定它作爲約束的一部分時的默認行爲? – elithrar

+1

@elithrar - 如果您不指定'ON DELETE'子句,則默認情況下,如果存在子行,則會阻止刪除父行。如果刪除父項並創建孤立項,則「ON DELETE SET NULL」將子項的父項設置爲「NULL」。如果父項被刪除,則「ON DELETE CASCADE」將完全刪除子記錄。獲得默認行爲的唯一方法是省略「ON DELETE」子句 - 它不會顯示「ON DELETE NO ACTION」是有效的語法。 –

+0

清除它。我對Postgres更加熟悉,所以Oracle的一些特性讓我受益匪淺。似乎默認的行爲是我所追求的。 – elithrar

0

把你限制在最後:

CREATE TABLE Flight (
    flight_no varchar2(10) NOT NULL, 
    airplane_id varchar2(20) NOT NULL, 
    dept_date date NOT NULL, 
    CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id) ON UPDATE RESTRICT ON DELETE RESTRICT 
); 
+0

謝謝 - 做嘗試,但被吐出一個荒謬的錯誤我不能牽制/正確: '錯誤在命令行:11列:11 錯誤報告: SQL錯誤:ORA-00905:缺少關鍵字 00905. 00000 - 「丟失的關鍵字」 *原因: *措施:' 其中提到這條線: '約束flight_airplane_id_fk外鍵(airplane_id)參考文獻飛機(airplane_id) ON UPDATE RESTRICT ON DELETE制約,' – elithrar