[英]No unique or primary key for this column list?
我已經為父表編寫了代碼,但是當我嘗試運行 sql 命令來生成子表時,我得到了一個匹配的錯誤:
“此列列表沒有匹配的唯一鍵或主鍵”
父表生成如下:
CREATE TABLE dabel3_RetailCenter
(store_id CHAR (4) NOT NULL,
store_type VARCHAR2 (15) NOT NULL,
store_st_num CHAR (4) NOT NULL,
store_st_name VARCHAR2 (50) NOT NULL,
store_city VARCHAR2 (15) NOT NULL,
store_state VARCHAR2 (12) NOT NULL, store_ZIP CHAR (5),
CONSTRAINT dabel3_store_id_pk PRIMARY KEY (store_id));
CREATE TABLE dabel3_Trans_Type (
TM_ID CHAR (2) NOT NULL,
TM_Type VARCHAR2 (15) NOT NULL,
CONSTRAINT dabel3_Trans_type_TM_ID_pk PRIMARY KEY (TM_ID),
CONSTRAINT TM_Type_UNQ UNIQUE (TM_TYPE));
CREATE TABLE dabel3_Trans_Mode (
TM_ID CHAR (2) NOT NULL,
TM_Route VARCHAR2 (15) NOT NULL,
TM_Sched_Num CHAR (3) NOT NULL,
CONSTRAINT dabel3_Trans_mode_pk PRIMARY KEY (TM_ID, TM_Sched_Num),
CONSTRAINT dabel3_trans_mode_TM_ID_fk FOREIGN KEY (TM_ID) REFERENCES dabel3_Trans_Type (TM_ID));
但是,子表不會生成。 知道我做錯了什么嗎?
CREATE TABLE dabel3_Shipment (
pkg_track_num VARCHAR2 (15) NOT NULL,
pkg_weight CHAR (7) NOT NULL,
pkg_dimensions VARCHAR2 (20),
pkg_insurance VARCHAR2 (50),
pkg_dest_city VARCHAR2 (20) NOT NULL,
pkg_dest_state CHAR (2) NOT NULL,
pkg_dest_ZIP CHAR (5) NOT NULL,
pkg_due_date DATE NOT NULL,
store_id CHAR (4) NOT NULL,
TM_ID CHAR (2) NOT NULL,
TM_Sched_Num CHAR (3) NOT NULL,
CONSTRAINT dabel3_pkg_track_num_pk PRIMARY KEY (pkg_track_num),
CONSTRAINT dabel3_shipment_store_id_fk FOREIGN KEY (store_id) REFERENCES dabel3_RetailCenter (store_id),
CONSTRAINT dabel3_shipment_TM_ID_fk FOREIGN KEY (TM_ID) REFERENCES dabel3_Trans_Type (TM_ID),
CONSTRAINT dabel3_shipment_TM_Sched_Num_fk FOREIGN KEY (TM_Sched_Num) REFERENCES dabel3_Trans_Mode (TM_Sched_Num));
如果我遇到這樣的問題,我會將失敗的語句分割成更容易調試的部分:
CREATE TABLE dabel3_Shipment (
pkg_track_num VARCHAR2 (15) NOT NULL,
pkg_weight CHAR (7) NOT NULL,
pkg_dimensions VARCHAR2 (20),
pkg_insurance VARCHAR2 (50),
pkg_dest_city VARCHAR2 (20) NOT NULL,
pkg_dest_state CHAR (2) NOT NULL,
pkg_dest_ZIP CHAR (5) NOT NULL,
pkg_due_date DATE NOT NULL,
store_id CHAR (4) NOT NULL,
TM_ID CHAR (2) NOT NULL,
TM_Sched_Num CHAR (3) NOT NULL
);
Table DABEL3_SHIPMENT created
ALTER TABLE dabel3_Shipment ADD
CONSTRAINT dabel3_pkg_track_num_pk PRIMARY KEY (pkg_track_num);
Table DABEL3_SHIPMENT altered.
ALTER TABLE dabel3_Shipment ADD
CONSTRAINT dabel3_shipment_store_id_fk FOREIGN KEY (store_id)
REFERENCES dabel3_RetailCenter (store_id);
Table DABEL3_SHIPMENT altered.
ALTER TABLE dabel3_Shipment ADD
CONSTRAINT dabel3_shipment_TM_ID_fk FOREIGN KEY (TM_ID)
REFERENCES dabel3_Trans_Type (TM_ID);
Table DABEL3_SHIPMENT altered.
ALTER TABLE dabel3_Shipment ADD
CONSTRAINT dabel3_sht_TM_Sched_Num_fk
FOREIGN KEY (TM_Sched_Num)
REFERENCES dabel3_Trans_Mode (TM_Sched_Num);
ORA-02270: no matching unique or primary key for this column
所以,錯誤就在這個子句中。 引用的列上沒有主鍵或唯一鍵。 一旦我們修復它...
ALTER TABLE dabel3_Trans_Mode ADD
CONSTRAINT dabel3_Trans_mode_sm_unq UNIQUE(TM_Sched_Num);
Table DABEL3_TRANS_MODE altered.
...約束編譯:
ALTER TABLE dabel3_Shipment ADD
CONSTRAINT dabel3_sht_TM_Sched_Num_fk
FOREIGN KEY (TM_Sched_Num)
REFERENCES dabel3_Trans_Mode (TM_Sched_Num);
Table DABEL3_SHIPMENT altered.
編輯:
@The Impaler 顯然是正確的,復合鍵將是一個更好的解決方案。
dabel3_Shipment
的最后一個表創建是錯誤的:
CONSTRAINT dabel3_shipment_TM_Sched_Num_fk
FOREIGN KEY (TM_Sched_Num)
REFERENCES dabel3_Trans_Mode (TM_Sched_Num) -- NOT a key
問題是dabel3_Trans_Mode
的列TM_Sched_Num
不是鍵。 為了建立外鍵,它必須指向遠程表中的一個鍵。
被引用的表有一個復合鍵(TM_ID, TM_Sched_Num)
。 您正在嘗試使用部分密鑰,而那不是密鑰。 整個使用它,兩列,問題就解決了。
例如,您可以這樣做:
CONSTRAINT dabel3_shipment_TM_Sched_Num_fk
FOREIGN KEY (TM_ID, TM_Sched_Num)
REFERENCES dabel3_Trans_Mode (TM_ID, TM_Sched_Num)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.