Нет уникального или первичного ключа для этого списка столбцов? - PullRequest
1 голос
/ 08 апреля 2020

Я написал код для родительских таблиц, но когда я пытаюсь запустить команду 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));

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Если я столкнусь с такой проблемой, я разделю ошибочный оператор на биты, которые легче отлаживать:

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.

РЕДАКТИРОВАТЬ:

@ Impaler, очевидно, прав, составной ключ было бы лучшим решением.

1 голос
/ 08 апреля 2020

Последнее создание таблицы 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 НЕ является ключом. Чтобы установить sh внешний ключ, он должен указать на ключ в удаленной таблице.

Указанная таблица имеет составной ключ (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)
...