2012-07-06 96 views
1
SQL> create table Drugs (
    2 DrugNumber smallint primary key, 
    3 DrugMarketName varchar(40), 
    4 DrugGenericName varchar(40), 
    5 PackSize smallint, 
    6 UnitCost numeric(7,2), 
    7 foreign key (DrugSupplierNumber) references Drug_Suppliers (DrugSupplierNumber)); 
foreign key (DrugSupplierNumber) references Drug_Suppliers (DrugSupplierNumber) 
) 
      * 
ERROR at line 7: 
ORA-00904: "DRUGSUPPLIERNUMBER": invalid identifier 
+1

我沒有看到毒品表格定義中的DrugSupplierNumber列。 Oracle同意我的觀點 - 添加一個。 – duffymo 2012-07-06 18:47:43

回答

3

Oracle抱怨(正確)您的表定義中沒有列DrugSupplierNumber。 要麼擺脫「外鍵」,要麼創建一個正常的列DrugSupplierNumber並在之後添加約束;例如對於V1:

create table Drugs (
    DrugNumber smallint primary key, 
    DrugMarketName varchar(40), 
    DrugGenericName varchar(40), 
    PackSize smallint, 
    UnitCost numeric(7,2), 
    DrugSupplierNumber references Drug_Suppliers (DrugSupplierNumber) 
); 
2

您正試圖創建涉及一列DrugSupplierNumber不是表的一部分外鍵約束。您不希望在此表上創建外鍵,或者您想要向此表中添加DrugSupplierNumber列,或者您想在約束中引用此表中的其他列之一。我的猜測是,你忘了將DrugSupplierNumber列添加到表定義。

雖然它在語法上是有效的,但在Oracle表中聲明列爲smallint的行爲不太可能正在做你想做的事情。這是NUMBER(38)的別名,因此如果您來自非Oracle數據庫,它不會提供任何(合理的)上限,就像您期望的那樣。

SQL> create table foo(col1 smallint); 

Table created. 

SQL> desc foo 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
COL1            NUMBER(38) 

此外,在Oracle,這將是更加常規的申報字符串列作爲VARCHAR2而非VARCHAR和作爲NUMBER(7,2)而非NUMERIC(7,2)申報UnitCost柱。