2016-05-13 62 views
1

我正在學習使用Oracle 12.1。如何在定義列的同一行中定義外鍵?

下面的外鍵定義有什麼問題?

set echo on 
drop table city; 
drop table emp; 

create table city (
    id number primary key, 
    name varchar2(20) 
); 

create table emp (
    id number, 
    cityid number foreign key references city(id) 
); 

當我執行它時,出現以下錯誤。

$ sqlplus/as sysdba @foo.sql 
... 
... 
SQL> 
SQL> create table city (
    2  id number primary key, 
    3  name varchar2(20) 
    4 ); 

Table created. 

SQL> 
SQL> create table emp (
    2  id number, 
    3  cityid number foreign key references city(id) 
    4 ); 
    cityid number foreign key references city(id) 
        * 
ERROR at line 3: 
ORA-00907: missing right parenthesis 

我認爲在定義列的同一行中定義列的外鍵約束是有效的。

我正在使用在http://www.w3schools.com/sql/sql_foreignkey.asp> CREATE TABLE> SQL Server/Oracle/MS Access上的SQL FOREIGN KEY約束下定義的語法。

這個語法在Oracle 12.1中真的無效嗎?

+0

只使用'cityid數字引用city(id)'或'cityid CONSTRAINT some_name REFERENCES city(id) – krokodilko

回答

5

Oracle在定義列時創建約束的語法不允許使用關鍵字foreign key;你的說法應該是:

create table emp (
    id number, 
    cityid number references city(id) 
); 

如果你希望把你的約束,沒有一個單獨的語句創建它,你可以使用:

create table emp (
    id number, 
    cityid number constraint CONSTRAINT_NAME references city(id) 
); 
+0

這有點誤導。在內聯約束中(即在列級定義),禁止使用關鍵字FOREIGN KEY(與「不需要」不同)。另外,FOREIGN KEY不是一個子句,它只是兩個關鍵字。 (該子句是一個內聯約束子句,只有語法不同。)另一方面,在一個外聯約束中(在表級定義,而不是在列級定義),關鍵字FOREIGN KEY是* *需要**。 https://docs.oracle.com/database/121/SQLRF/clauses002.htm#CJAGIICD – mathguy

0

你可以試試這個方法

create table emp (
id number, 
cityid number, CONSTRAINT cityid_fk FOREIGN KEY (cityid) REFERENCES city(id) 
); 

也就是上面的那個:)

唯一的區別是你定義的是constr aid name「cityid_fk」,在另一個例子中,oracle會給你一個默認名稱,如(CONSTRAINT「CONSTRAINT_NAME」)