我不断收到各种错误,例如:
从命令-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);
答案 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输入有效的代码。