2011-11-03 72 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