无法找出我的SQL代码有什么问题

时间:2020-03-09 17:42:45

标签: sql oracle

我不断收到各种错误,例如:

从命令-00906中的第21行开始出错。00000-“缺少左括号”

ALTER TABLE组件添加约束SUPPLIERID_FK外键(SUPPLIERID)参考SUPPLIER(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 个答案:

答案 0 :(得分:1)

您所引用的表COMPONENTS中没有主键或唯一约束。所以这是错误的:

ALTER TABLE PRODUCTS ADD CONSTRAINT PRODUCTS_FK 
FOREIGN KEY (CID) REFERENCES COMPONENTS(CID);

但是,如果您像这样创建表COMPONENTS:

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 '(___) ___-____'));

您的SUPPLIER表中没有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);

请注意,这仅是为什么的答案。这不是做某事的答案。您知道是否需要这样的唯一键和主键。

最后here is a demo输入有效的代码。