2012-07-06 63 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柱。