在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中的默认行为,但我希望尽可能明确。
答案 0 :(得分:5)
首先,在Oracle中,没有ON UPDATE RESTRICT
或ON DELETE RESTRICT
选项。这些似乎在其他数据库引擎中有效,但它们不在constraint syntax diagram中,并且似乎无效。有一个ON DELETE
子句,但只有两个有效选项是CASCADE
或SET 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
);