У вас нет первичного ключа или уникального ограничения в таблице КОМПОНЕНТЫ, на которые вы ссылаетесь. Так что это неправильно:
ALTER TABLE PRODUCTS ADD CONSTRAINT PRODUCTS_FK
FOREIGN KEY (CID) REFERENCES COMPONENTS(CID);
Но если вы создадите таблицу КОМПОНЕНТОВ, как это:
CREATE TABLE COMPONENTS (
CID INT ,
C_DESCRIPTION VARCHAR2(20),
SUPPLIERID INT,
PID INT,
CONSTRAINT COMPONENTS_PK PRIMARY KEY(PID, CID, SUPPLIERID),
CONSTRAINT constraint_name UNIQUE (CID)
);
Тогда вы можете запустить этот оператор ALTER
.
В одной таблице может быть только один первичный ключ, так что это неправильно:
CREATE TABLE SUPPLIER(
--on delete /updatecascade
SUPPLIER_NAME VARCHAR2(20) NOT NULL,
S_ID INT PRIMARY KEY,
PHONE CHAR(14), CONSTRAINT PHONE_FORMAT CHECK (PHONE LIKE '(___) ___-____') ,
CONSTRAINT SUPPLIER_PK PRIMARY KEY);
И это нормально:
CREATE TABLE SUPPLIER(
--on delete /updatecascade
SUPPLIER_NAME VARCHAR2(20) NOT NULL,
S_ID INT PRIMARY KEY,
PHONE CHAR(14), CONSTRAINT PHONE_FORMAT CHECK (PHONE LIKE '(___) ___-____'));
В вашем столбце SUPPLIERID нет Таблица ПОСТАВЩИКА, так что это не нормально:
ALTER TABLE COMPONENTS ADD CONSTRAINT SUPPLIERID_FK
FOREIGN KEY(SUPPLIERID) REFERENCES SUPPLIER(SUPPLIERID);
Но это будет нормально:
ALTER TABLE COMPONENTS ADD CONSTRAINT SUPPLIERID_FK
FOREIGN KEY(SUPPLIERID) REFERENCES SUPPLIER(S_ID);
Обратите внимание, это ответ только на вопрос почему. Это не ответ, как что-то сделать. Вы знаете, если вам нужен уникальный ключ и первичный ключ, как это.
Для конца вот демка с работающим кодом.