为什么这个SQL代码显示“缺少右括号”的错误?

时间:2015-11-04 07:02:48

标签: sql oracle

CREATE TABLE PoolActivity_T 
(PoolID          NUMBER(11,0)       NOT NULL,
ServiceDate      DATE DEFAULT SYSDATE   NOT NULL,
ActivityID       NUMBER(11,0)   NOT NULL,
CONSTRAINT PoolActivity_PK PRIMARY KEY (PoolID,ServiceDate,ActivityID)
CONSTRAINT PoolActivity_FK FOREIGN KEY (PoolID) 
REFERENCES PoolVisit_T(PoolID),
CONSTRAINT PoolActivity_FK FOREIGN KEY (ActivityID) 
REFERENCES Activity_T (ActivityID)
);

这是我的代码,我无法弄清楚为什么会出现错误。

CREATE TABLE Customer_T 
(CustomerID          NUMBER(11,0)       NOT NULL,
CustomerFname          VARCHAR2(25),
CustomerMname          VARCHAR2(25),
CustomerLname          VARCHAR2(25),
CustomerAddress1          VARCHAR2(50),
CustomerAddress2          VARCHAR2(50),
CustomerCity          VARCHAR2(25), 
CustomerState          CHAR(2), 
CustomerZipCode         NUMBER(5,0),
CustomerPhoneNumber     NUMBER(11,0),
CONSTRAINT Customer_PK PRIMARY KEY (CustomerID)
);

CREATE TABLE Pool_T     
(PoolID          NUMBER(11,0)       NOT NULL,
PoolAddress1    VARCHAR2(25),
PoolAddress2        VARCHAR2(25),
PoolCity        VARCHAR2(25),
PoolState       VARCHAR2(25),
PoolZipCode     NUMBER(5,0),
TypeSurface     VARCHAR2(9),
Gallon      INTEGER,
Filters     VARCHAR2(25),
VisitPerMonth   INTEGER,    
Dates           DATE DEFAULT SYSDATE,
Fee         NUMBER(11,0),
CONSTRAINT Pool_PK PRIMARY KEY (PoolID)
);

CREATE TABLE PoolVisit_T 
(PoolID          NUMBER(11,0)       NOT NULL,
ServiceDate      DATE DEFAULT SYSDATE   NOT NULL,
LengthStay       INTEGER,
CONSTRAINT Poolvisit_PK PRIMARY KEY (PoolID,ServiceDate)
CONSTRAINT PoolVisit_FK FOREIGN KEY (PoolID) 
REFERENCES Pool_T (PoolID)
);

CREATE TABLE PoolActivity_T 
(PoolID          NUMBER(11,0)       NOT NULL,
ServiceDate      DATE DEFAULT SYSDATE   NOT NULL,
ActivityID       NUMBER(11,0)   NOT NULL,
CONSTRAINT PoolActivity_PK PRIMARY KEY (PoolID,ServiceDate,ActivityID)
CONSTRAINT PoolActivity_FK FOREIGN KEY (PoolID) 
REFERENCES PoolVisit_T(PoolID),
CONSTRAINT PoolActivity_FK FOREIGN KEY (ActivityID) 
REFERENCES Activity_T (ActivityID)
);

CREATE TABLE PoolChemical_T 
(PoolID          NUMBER(11,0)       NOT NULL, 
ServiceDate     DATE DEFAULT SYSDATE    NOT NULL,
ChemicalName    VARCHAR2(25)        NOT NULL,
Quantity        INTEGER,
Cost            NUMBER(11,2),
CONSTRAINT PoolChemical_PK PRIMARY KEY (PoolID,ServiceDate,ChemicalName)
CONSTRAINT PoolChemical_FK FOREIGN KEY (PoolID) 
REFERENCES PoolVisit_T(PoolID)
CONSTRAINT PoolChemical_FK FOREIGN KEY (ChemicalName) 
REFERENCES Chemical_T(ChemicalName)
);

CREATE TABLE Activity_T 
(ActivityID          NUMBER(11,0)       NOT NULL,
ActivityDesc         VARCHAR2(500), 
CONSTRAINT Activity_PK PRIMARY KEY (ActivityID));

CREATE TABLE Chemical_T 
(ChemicalName        VARCHAR2(25)       NOT NULL,
CONSTRAINT Chemical_PK PRIMARY KEY (ChemicalName));

1 个答案:

答案 0 :(得分:0)

错误不仅出现在您突出显示的表格中,而且还出现在PoolVisit_T之前的表格中。在两者中,您只是在主键约束之后缺少逗号:

CREATE TABLE PoolVisit_T 
(PoolID          NUMBER(11,0)       NOT NULL,
ServiceDate      DATE DEFAULT SYSDATE   NOT NULL,
LengthStay       INTEGER,
CONSTRAINT Poolvisit_PK PRIMARY KEY (PoolID,ServiceDate), -- was missing comma
CONSTRAINT PoolVisit_FK FOREIGN KEY (PoolID) 
REFERENCES Pool_T (PoolID)
);

CREATE TABLE PoolActivity_T 
(PoolID          NUMBER(11,0)       NOT NULL,
ServiceDate      DATE DEFAULT SYSDATE   NOT NULL,
ActivityID       NUMBER(11,0)   NOT NULL,
CONSTRAINT PoolActivity_PK PRIMARY KEY (PoolID,ServiceDate,ActivityID), -- was missing
CONSTRAINT PoolActivity_FK FOREIGN KEY (PoolID) 
REFERENCES PoolVisit_T(PoolID),
CONSTRAINT PoolActivity_FK FOREIGN KEY (ActivityID) 
REFERENCES Activity_T (ActivityID)
);

在那之后,你错过了两个:

CREATE TABLE PoolChemical_T 
(PoolID          NUMBER(11,0)       NOT NULL, 
ServiceDate     DATE DEFAULT SYSDATE    NOT NULL,
ChemicalName    VARCHAR2(25)        NOT NULL,
Quantity        INTEGER,
Cost            NUMBER(11,2),
CONSTRAINT PoolChemical_PK PRIMARY KEY (PoolID,ServiceDate,ChemicalName), -- was missing
CONSTRAINT PoolChemical_FK FOREIGN KEY (PoolID) 
REFERENCES PoolVisit_T(PoolID), -- was missing
CONSTRAINT PoolChemical_FK FOREIGN KEY (ChemicalName) 
REFERENCES Chemical_T(ChemicalName)
);

如果您使用像SQL Developer这样的IDE,它会突显出这样的语法问题。

但你还有问题;你的PoolActivity_T外键:

CONSTRAINT PoolActivity_FK FOREIGN KEY (PoolID) 
REFERENCES PoolVisit_T(PoolID),

仅指PoolID,但PoolVisit_T上的主键和主键有两列,因此需要:

CONSTRAINT PoolActivity_FK FOREIGN KEY (PoolID,ServiceDate) 
REFERENCES PoolVisit_T(PoolID,ServiceDate),

你已经为两个约束使用了相同的FK名称,所以下一个是:

CONSTRAINT PoolActivity_FK2 FOREIGN KEY (ActivityID) 
REFERENCES Activity_T (ActivityID)

(但可能选择更具描述性的FK名称),你必须在此之前创建Activity_T表。

PoolChemical_T的类似问题:

CONSTRAINT PoolChemical_PK PRIMARY KEY (PoolID,ServiceDate,ChemicalName),
CONSTRAINT PoolChemical_FK FOREIGN KEY (PoolID,ServiceDate) 
REFERENCES PoolVisit_T(PoolID,ServiceDate),
CONSTRAINT PoolChemical_FK2 FOREIGN KEY (ChemicalName)
REFERENCES Chemical_T(ChemicalName)

首先创建Chemical_T

SQL Fiddle创建了所有表格。