Oracle代码不正确
问题描述:
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
答
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)
);
答
您正试图创建涉及一列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
柱。
我没有看到毒品表格定义中的DrugSupplierNumber列。 Oracle同意我的观点 - 添加一个。 – duffymo 2012-07-06 18:47:43