前情描述

最近使用达梦数据库发现,如果给一张表添加了唯一约束,通过for update的方式去维护数据违反唯一约束时会显示“提交成功”,并没有提示任何异常,但是数据实际上是没有维护成功的!

达梦数据库版本:DM8

准备

我新建数据库表A_TEST,添加了联合唯一约束id和name,并插入三数据:

CREATE TABLE "A_TEST"
(
"id"     VARCHAR2(50),
"name"   VARCHAR2(50),
"gender" VARCHAR2(50),
"AGE"    NUMBER(10,0),
UNIQUE("id", "name"));
insert into A_TEST(id,name,gender,age)values('1','张三','男',12);
insert into A_TEST(id,name,gender,age)values('2','李四','男',14);
insert into A_TEST(id,name,gender,age)values('2',NULL,'男',14);

初始查询结果为:
在这里插入图片描述

测试

测试一(表添加联合唯一约束且约束字段name内容为NULL,不违反唯一约束的情况下,修改唯一约束字段内容):

将第三条数据的ID从 2 改为 3 。
1.使用for update 修改数据,如下图:
在这里插入图片描述
2.使用update SQL语句修改数据,修改成功!如下图:

update A_TEST set id='3' where name is null;

在这里插入图片描述

测试二(表添加联合唯一约束且约束字段name内容为NULL,不违反唯一约束的情况下,修改非唯一约束字段内容):

由于id是唯一约束,那么我们来修改第三行的非唯一约束字段gender,将gender从“男”修改为“女”。
1.使用for update 修改数据,如下图:
在这里插入图片描述
2.使用update SQL语句修改数据,修改成功!如下图:

update A_TEST set gender='女' where name is null;

在这里插入图片描述
由测试一和测试二开始怀疑:如果联合唯一约束任意一个字段为NULL,使用for update修改数据,不论是否违反唯一约束都提示提交成功,不报任何异常,但实际上任何内容都无法修改,即使是非约束字段也不能修改。使用update SQL 语句可以做任何修改,若违反唯一约束会正常报错。

测试三(表添加联合唯一约束且约束字段name内容不为NULL,不违反唯一约束的情况下,修改唯一约束字段内容)

如果当前数据表的唯一约束字段都不为NULL,如下图:
在这里插入图片描述

测试四(表添加联合唯一约束且约束字段name内容为NULL,违反唯一约束的情况下,修改唯一约束字段内容)

当前数据表的唯一约束字段都不为NULL的情况下,我们将“王五”修改为“李四”。如下图:
在这里插入图片描述
由于第三条数据和第二条数据的ID和Name相同,所以会报错违反唯一约束,报错是正常的。

测试五(表未加唯一约束,修改字段内容):

当前表已经删除了唯一约束,我们再次将第三条数据的Name从NULL修改为“张三”,如下图:
在这里插入图片描述
提交并不报错,再次查询提交后的结果,显示修改成功!如下图:
在这里插入图片描述

结论

  1. 表添加了联合唯一约束时,如果任意一个约束字段为NULL,使用for update修改数据,不论是否违反唯一约束都提示提交成功并且不报任何异常,但实际上修改是失败的,任何字段内容都无法修改,即使是非约束字段也不能修改。使用update SQL 语句可以做任何修改,若违反唯一约束会正常报错。
  2. 表添加了联合唯一约束时,如果任意一个约束字段都不为NULL,无论使用for update还是update SQL去修改数据,只要违反唯一约束都会修改失败,并提示异常信息。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐