Не могу понять, что не так с моим SQL кодом - PullRequest
0 голосов
/ 09 марта 2020

Я продолжаю получать ошибки различного типа, такие как:

Ошибка запуска в строке: 21 в команде - 00906. 00000 - "отсутствует левая скобка"

ALTER TABLE COMPONENTS ADD CONSTRAINT SUPPLIERID_FK ИНОСТРАННЫЙ КЛЮЧ (SUPPLIERID) ССЫЛКИ ПОСТАВЩИК (SUPPLIERID); 00942. 00000 - «таблица или представление не существует»

Но я не могу понять, как получается, что таблица не существует или даже где находится непревзойденная скобка

    CREATE TABLE PRODUCTS (
 PNAME VARCHAR2(20) NOT NULL,
 PID INT,
 QUANTITY INT,
 CID INT NOT NULL,
 PRIMARY KEY(PID,CID)
);

CREATE TABLE COMPONENTS (
CID INT , 
C_DESCRIPTION VARCHAR2(20),
S_ID INT,
PID INT,
 CONSTRAINT COMPONENTS_PK PRIMARY KEY(PID,CID,S_ID)
);


ALTER TABLE PRODUCTS ADD CONSTRAINT PRODUCTS_FK FOREIGN KEY (CID) REFERENCES COMPONENTS(CID);
ALTER TABLE COMPONENTS ADD CONSTRAINT PRODUCTID_FK FOREIGN KEY(PID) REFERENCES PRODUCTS(PID);
--ALTER TABLE COMPONENTS ADD CONSTRAINT PRODUCTID_FK FOREIGN KEY(PID,CID) REFERENCES PRODUCTS(PID,CID);

CREATE TABLE SUPPLIER( --on delete /updatecascade
SUPPLIER_NAME VARCHAR2(20) NOT NULL,
 S_ID INT ,
 PHONE CHAR(14), CONSTRAINT PHONE_FORMAT CHECK (PHONE LIKE '(___) ___-____') ,
 CONSTRAINT SUPPLIER_PK PRIMARY KEY (S_ID)
 );

ALTER TABLE COMPONENTS ADD CONSTRAINT SUPPLIERID_FK FOREIGN KEY(S_ID) REFERENCES SUPPLIER(S_ID);

1 Ответ

1 голос
/ 09 марта 2020

У вас нет первичного ключа или уникального ограничения в таблице КОМПОНЕНТЫ, на которые вы ссылаетесь. Так что это неправильно:

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);

Обратите внимание, это ответ только на вопрос почему. Это не ответ, как что-то сделать. Вы знаете, если вам нужен уникальный ключ и первичный ключ, как это.

Для конца вот демка с работающим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...