达梦数据库唯一约束失效问题,for update和update
前情描述
最近使用达梦数据库发现,如果给一张表添加了唯一约束,通过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修改为“张三”,如下图:
提交并不报错,再次查询提交后的结果,显示修改成功!如下图:
结论
- 表添加了联合唯一约束时,如果任意一个约束字段为NULL,使用for update修改数据,不论是否违反唯一约束都提示提交成功并且不报任何异常,但实际上修改是失败的,任何字段内容都无法修改,即使是非约束字段也不能修改。使用update SQL 语句可以做任何修改,若违反唯一约束会正常报错。
- 表添加了联合唯一约束时,如果任意一个约束字段都不为NULL,无论使用for update还是update SQL去修改数据,只要违反唯一约束都会修改失败,并提示异常信息。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)