【问题标题】:I get this error executing table three "The specified constraint name has to be unique. *Action: Specify a unique constraint name for the constraint执行表三时出现此错误“指定的约束名称必须是唯一的。*操作:为约束指定唯一的约束名称
【发布时间】:2018-09-01 22:28:39
【问题描述】:

表一:

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

执行表三时出现此错误:

"指定的约束名称必须是唯一的。*Action: 为约束指定一个唯一的约束名称

如何防止此错误发生?

【问题讨论】:

  • 我认为这是 stackoverflow.com/questions/1397671/… 的副本。本质上,约束名称在数据库中必须是唯一的,而不仅仅是在表中是唯一的。至少您有两个名称为 CustNoNotNull。就个人而言,我通常会省略约束名称并允许数据库自动分配它们。另一种常见的模式是在表名前添加 CustomerCustNoNotNull 和 EventRequestCustNoNotNull。
  • 谢谢@StevenW.Klassen,我确实添加了约束名称,它按照您的建议创建了表格,但就像您说的那样,让数据库自动分配更好,再次感谢
  • 顺便说一句,我建议avoiding the char datatype

标签: oracle oracle11g constraints


【解决方案1】:

在 Oracle 中,约束是一种对象,它们有一个标识符(用于区别于其他对象的名称)。架构内所有表上的所有约束共享相同的名称空间。这意味着您不能在同一架构中拥有两个具有相同名称的约束,即使它们位于不同表上。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2014-09-12
    • 2017-05-26
    • 2018-11-24
    • 2018-02-02
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多