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
質問する
62 次
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 に答える