Oracle中的外键约束问题

时间:2011-11-03 14:05:50

标签: oracle

在Oracle 9i中声明FK时出现问题。我已经在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:我理解ON UPDATE RESTRICT是Oracle中的默认行为,但我希望尽可能明确。

2 个答案:

答案 0 :(得分:5)

首先,在Oracle中,没有ON UPDATE RESTRICTON DELETE RESTRICT选项。这些似乎在其他数据库引擎中有效,但它们不在constraint syntax diagram中,并且似乎无效。有一个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>>
);

答案 1 :(得分: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
);