我在执行表三时遇到此错误“指定的约束名称必须是唯一的。*操作:为约束指定唯一的约束名称

时间:2018-09-01 22:28:40

标签: oracle oracle11g constraints

表一:

CREATE TABLE Customer 
(CustNo VARCHAR2(8) CONSTRAINT CustNoNotNull NOT NULL, 
 CustName VARCHAR2(30) CONSTRAINT CustNameNotNull NOT NULL, 
 Address VARCHAR2(50) CONSTRAINT AddressNotNull NOT NULL, 
 Internal CHAR(1) CONSTRAINT InternalNotNull NOT NULL, 
 Contact VARCHAR2(35) CONSTRAINT ContractNotNull NOT NULL, 
 Phone VARCHAR2(11) CONSTRAINT CPhoneNotNull NOT NULL, 
 City VARCHAR2(30) CONSTRAINT CityNotNull NOT NULL,
 State VARCHAR2(2) CONSTRAINT StateNotNull NOT NULL, 
 Zip VARCHAR2(10) CONSTRAINT zipNotNull NOT NULL,
  CONSTRAINT PK_CUSTOMER PRIMARY KEY (CustNo) ) ;

表二:

CREATE TABLE Facility
(FacNo VARCHAR2(8) CONSTRAINT FacNoNotNull NOT NULL, 
 FacName VARCHAR2(30) CONSTRAINT FacNameNotNull NOT NULL,
   CONSTRAINT PK_FACILITY PRIMARY KEY (FacNo) 
   CONSTRAINT Unique_FacName UNIQUE(FacName) );

表三:

CREATE TABLE EVENTREQUEST
( EVENTNO VARCHAR2(8) CONSTRAINT EVENTNONOTNULL NOT NULL, 
  DATEHELD DATE CONSTRAINT DATEHELDNOTNULL NOT NULL,
  DATEREQ DATE CONSTRAINT DATEREQNOTNULL NOT NULL,
  CUSTNO VARCHAR2(8) CONSTRAINT CUSTNONOTNULL NOT NULL ,
  FACNO VARCHAR2(8) CONSTRAINT FACNONOTNULL NOT NULL,
  DATEAUTH DATE CONSTRAINT DATEAUTHNULL NULL,
  STATUS VARCHAR2(10) CONSTRAINT STATUSNOTNULL NOT NULL,
  ESTCOST VARCHAR2(25) CONSTRAINT ESTCOSTNOTNULL NOT NULL,
  ESTAUDIENCE VARCHAR2(10) CONSTRAINT ESTAUDIENCENOTNULL NOT NULL,
  BUDNO VARCHAR2(8) CONSTRAINT BUDNONULL  NULL,
        CONSTRAINT PK_EVENTREQUEST PRIMARY KEY (EVENTNO),
        CONSTRAINT FK_CUSTNO FOREIGN KEY (CUSTNO) REFERENCES CUSTOMER (CUSTNO),
        CONSTRAINT FK_FACNO FOREIGN KEY (FACNO) REFERENCES FACILITY (FACNO),
        CONSTRAINT CHECK_EVENTREQUEST_STATUS CHECK(STATUS IN('PENDING','DENIED','APPROVED')));

执行表三时出现此错误:

  

“指定的约束名称必须唯一。*操作:为约束指定唯一的约束名称

如何防止发生此错误?

1 个答案:

答案 0 :(得分:2)

在Oracle中,约束是对象的一种,并且它们具有标识符(将它们与其他对象区分开的名称)。模式中所有表上的所有约束共享相同的名称空间。这意味着即使在不同表上,也不能在同一模式中拥有两个具有相同名称的约束。

此外,默认情况下,标识符不区分大小写。在第二个表上,您定义了约束 FacNoNotNull ,在第三个表上,您正在尝试定义约束 FACNONOTNULL 。由于标识符不区分大小写,因此名称相同-您会遇到异常。

一种完全错误的方法(不幸的是,它会起作用,即使错误,很多人可能会倾向于这样做)是将名称括在双引号中,这使它们区分大小写。 不要这样做!

一个人不得不问-为什么首先需要命名NOT NULL约束?只需在列定义之后添加关键字NOT NULL即可;很难看到您何时/何地需要知道每个此类约束的名称

相关问题