Oracle中的外键约束问题

3

在Oracle 9i中声明外键出现了问题。我已经查看了一些SO和在线文档(例如http://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php)的示例,但并没有真正的好运;尝试类似于链接中的语法会生成相同的错误:

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:我知道在Oracle中,ON UPDATE RESTRICT是默认行为,但我更喜欢尽可能明确。

2个回答

5
首先,在Oracle中,不存在ON UPDATE RESTRICTON DELETE RESTRICT选项。在其他数据库引擎中,这些似乎是有效的,但它们不在约束语法图中,并且似乎无效。有一个ON DELETE子句,但唯一的两个有效选项是CASCADESET NULL。没有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>>
);

太好了,谢谢。我参考了其他文档(例如http://www.dba-oracle.com/bk_on_delete_restrict_on_delete_no_action_tips.htm),但错过了“RESTRICT”不是有效参数的部分。似乎“NO ACTION”是有效的,但是当我尝试使用它时仍然会出现错误。简而言之,我想确保如果存在子项,则无法删除任何内容。如果没有明确指定作为约束的一部分,则我假设“ON DELETE CASCADE”是默认行为? - elithrar
1
@elithrar - 如果您没有指定ON DELETE子句,则默认情况下,如果存在子行,则会阻止删除父行。 ON DELETE SET NULL将子项的父键设置为NULL,如果删除父项,则创建孤儿。 ON DELETE CASCADE如果删除父项,则完全删除子记录。获取默认行为的唯一方法是省略ON DELETE子句--似乎ON DELETE NO ACTION不是有效语法。 - Justin Cave
这样就清楚了。我更熟悉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
);

谢谢 - 我尝试过了,但是它一直报错,我无法确定/更正这个毫无意义的错误:`Error at Command Line:11 Column:11Error report: SQL Error: ORA-00905: missing keyword 00905. 00000 - "missing keyword" *Cause:
*Action:`这是指这一行代码:CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id) ON UPDATE RESTRICT ON DELETE RESTRICT,
- elithrar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接