Sql 此列列表没有唯一键或主键?

Sql 此列列表没有唯一键或主键?,sql,oracle,Sql,Oracle,我已经为父表编写了代码,但是当我尝试运行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_c

我已经为父表编写了代码,但是当我尝试运行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_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));

上次创建的
dabel3\u装运
表格在以下位置错误:

CONSTRAINT dabel3_shipment_TM_Sched_Num_fk 
FOREIGN KEY (TM_Sched_Num) 
REFERENCES dabel3_Trans_Mode (TM_Sched_Num) -- NOT a key
问题在于
dabel3\u Trans\u Mode
的列
TM\u Sched\u Num
不是键。为了建立外键,它必须指向远程表中的键

引用的表有一个复合键
(TM\u ID,TM\u Sched\u Num)
。您试图使用部分密钥,但这不是密钥。全部使用,两列,问题解决

例如,您可以执行以下操作:

CONSTRAINT dabel3_shipment_TM_Sched_Num_fk 
FOREIGN KEY (TM_ID, TM_Sched_Num) 
REFERENCES dabel3_Trans_Mode (TM_ID, TM_Sched_Num)

上次创建的
dabel3\u装运
表格在以下位置错误:

CONSTRAINT dabel3_shipment_TM_Sched_Num_fk 
FOREIGN KEY (TM_Sched_Num) 
REFERENCES dabel3_Trans_Mode (TM_Sched_Num) -- NOT a key
问题在于
dabel3\u Trans\u Mode
的列
TM\u Sched\u Num
不是键。为了建立外键,它必须指向远程表中的键

引用的表有一个复合键
(TM\u ID,TM\u Sched\u Num)
。您试图使用部分密钥,但这不是密钥。全部使用,两列,问题解决

例如,您可以执行以下操作:

CONSTRAINT dabel3_shipment_TM_Sched_Num_fk 
FOREIGN KEY (TM_ID, TM_Sched_Num) 
REFERENCES dabel3_Trans_Mode (TM_ID, 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.
编辑:


@刺穿者显然是对的,复合密钥将是一个更好的解决方案。

如果我遇到这样的问题,我将把失败的语句分割成更易于调试的位:

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.
编辑:


@穿刺者显然是对的,复合键是更好的解决方案。

dabel3\u Trans\u模式的主键中有多少列?您在约束声明中指定了多少列
dabel3_shipping_TM_Sched_Num_fk
?可能不相关,但所有这些
CHAR
列都应该是
VARCHAR2
dabel3_Trans\u Mode
的主键中有多少列?您在约束声明中指定了多少列
dabel3\u shipping\u TM\u Sched\u Num\u fk
?可能不相关,但所有这些
CHAR
列都应该是
VARCHAR2