Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Oracle空唯一约束_Database_Oracle_Constraints - Fatal编程技术网

Database Oracle空唯一约束

Database Oracle空唯一约束,database,oracle,constraints,Database,Oracle,Constraints,唯一约束是否包含非空约束 我有一个例子,一个属性mobile可以是NULL,但不能重复,所以我给它两个约束:“notnull”和“unique”,在更新记录的情况下,如果用户没有输入值,我在字段中输入0,所以它会出现这个异常: SEVERE: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TEST1.OSQS_PARENTS_CELLPHONE_UK) violated 在更新

唯一约束是否包含非空约束

我有一个例子,一个属性
mobile
可以是
NULL
,但不能重复,所以我给它两个约束:“notnull”和“unique”,在更新记录的情况下,如果用户没有输入值,我在字段中输入0,所以它会出现这个异常:

 SEVERE: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TEST1.OSQS_PARENTS_CELLPHONE_UK) violated
更新
案例中,我应该怎么做

编辑 下面是表ddl的定义

CREATE TABLE "TEST1"."OSQS_PARENTS" 
(   "PARENT_NO" NUMBER(38,0), 
"PARENT_NAME" VARCHAR2(4000 BYTE), 
"PARENT_ID" NUMBER(38,0), 
"PARENT_EMAIL" VARCHAR2(30 BYTE), 
"PARENT_CELLPHONE" NUMBER(38,0)
)
这是约束的图像

这是update语句

    Parent aParent;      //is an object I pass through a function
String SQlUpdate = "UPDATE OSQS_PARENTS P SET P.PARENT_ID=?,P.PARENT_EMAIL=?,P.PARENT_CELLPHONE=?"
            + " where P.PARENT_NO=?";
    PreparedStatement pstmt = null;
    try {
        pstmt = con.prepareStatement(SQlUpdate);
        pstmt.setLong(1, aParent.getId());
        pstmt.setString(2, aParent.getEmail());
        pstmt.setLong(3, aParent.getCellPhoneNo());
        pstmt.setLong(4, parentNo);

        pstmt.executeUpdate();
    }
听起来是这样的:

手机必须是独一无二的。当用户未输入值时,将其标记为0。因此,当您尝试将多个0值插入“UNIQUE”列时,它将失败

我认为您需要删除列上的NOTNULL约束(允许它是唯一的是,但允许NULL)

然后,当用户输入no值时,将其用作no值(unknown=null 0--0是已知值)

在你的语句中加入一个IF,IF值就是你所拥有的,否则设置为NULL\

pstmt.setNull(3, java.sql.Types.INTEGER);

但这是合法的约束失败吗(即,您可能已经在约束列中有一条0的记录)?请显示完整的CREATE表格和约束定义以及相应的UPDATE语句。@Simon,在用户没有输入手机值的第一次更新中,我将字段更新为零,在第二个没有输入手机号码的用户中,我也尝试用零值更新记录,所以问题是,我不知道应该在update语句中输入什么值。正如@a_horse_with_no_name所说,如果您发布包含约束的表定义,我们将能够更好地提供帮助,还有你正在使用的声明。然而,听起来你没有正确使用
not NULL
——如果该值可以是“未知”(用零替换),那么它真的应该是
not NULL
且唯一吗?@Alaa:无需发布屏幕截图。如果单击该窗口中的SQL选项卡,您应该会看到所有需要的SQL。但更大的问题是,屏幕截图与错误消息不匹配。该错误指的是一个约束
OSQS\u PARENTS\u UK4CELL\u PHONE
,但从您发布的+1中看不到该约束。
OSQS\u PARENTS\u NULLCHECK
约束是有意义的,假设每个记录需要
PARENT\u EMAIL
PARENT\u mobile
,并将未知值设置为NULL(允许它们出现在约束涵盖的两列中)是最好的方法这背后的原因是Oracle使用索引实现了一个唯一的约束,并且空值没有索引。这就是为什么可以有多个不“碰撞”的空值。@Adam:nulls没有索引,除非在多列索引中至少有一列不是空的情况下。