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
4

2 に答える 2

3

オラクルは、テーブル定義に列 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) 
);
于 2012-07-06T18:48:57.997 に答える
2

DrugSupplierNumberテーブルの一部ではない列を含む外部キー制約を作成しようとしています。このテーブルに外部キーを作成したくないか、このテーブルにDrugSupplierNumber列を追加したいか、制約でこのテーブルの他の列の 1 つを参照したいかのいずれかです。DrugSupplierNumber私の推測では、テーブル定義に列を追加するのを忘れただけです。

構文的には有効ですが、Oracle テーブルで列を宣言しても、意図したとおりに動作する可能性はほとんどありsmallintません。これは a のエイリアスであるNUMBER(38)ため、Oracle以外のデータベースから来た場合に予想されるような(合理的な)上限はありません。

SQL> create table foo( col1 smallint );

Table created.

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

VARCHAR2さらに、Oracle では、string 列をではなくとしてVARCHAR宣言し、UnitCost列をNUMBER(7,2)ではなくとして宣言する方がはるかに慣習的ですNUMERIC(7,2)

于 2012-07-06T18:52:13.983 に答える