数据库记录删除功能
在前续文章中我们介绍了如何插入和修改数据库记录,本篇文章会沿用之前的测试数据,介绍如何使用ADI平台定义一个删除目标数据库记录的接口,包括 单主键单表删除、复合主键单表删除、多表删除(整合前两者)三种方式。无论是单表删除还是多表删除,一旦发生异常,,那么默认情况下API平台的整个数据删除事务都将自动回滚。
1.需求说明
根据前续文章的例子,我们已经实现把幢数据和户数据插入市大数据局的数据库表中。假设数据局提出了新要求:当业务系统的幢和户数据发生删除时,要对已归集到数据局的数据做同步删除。首先让我们回顾下dsj数据库中幢和户的表结构。
dsj数据库的幢表名为dsj_zhuangs,建表语句如下:
sql
create table dsj_zhuangs
(
xh bigint(20) not null primary key auto_increment comment '幢序号',
zhdjdydm varchar(50) not null comment '幢登记单元代码',
zl varchar(100) comment '幢坐落'
);
alter table dsj_zhuangs add unique (zhdjdydm);
dsj数据库的户表名为dsj_hus,建表语句如下:
sql
create table dsj_hus
(
xh bigint(20) not null primary key auto_increment comment '户序号',
hdjdydm varchar(50) not null comment '户登记单元代码',
zhdjdydm varchar(50) not null comment '所属幢登记单元代码',
fbm varchar(50) comment '房编码',
qsc int(4) comment '起始层',
zhzhc int(4) comment '终止层',
fh varchar(50) comment '室号/部位',
zl varchar(100) comment '房屋坐落',
jzjg varchar(50) comment '建筑结构',
ghyt varchar(50) comment '规划用途',
jzmj double(18, 3) comment '建筑面积'
);
alter table dsj_hus add unique (hdjdydm);
-- 设置户表的外键:zhdjdydm
alter table dsj_hus add constraint hus_fk_zhdjdydm foreign key (zhdjdydm) references dsj_zhuangs(zhdjdydm);
接下来我们再回顾下之前已经写入dsj数据库的数据。
幢表(dsj_zhuangs)数据:
户表(dsj_hus)数据:
2.单主键单表删除幢数据
所谓单主键,是指我们要根据这个表的某一个字段作为where条件,来删除对应的数据库记录;这个字段可以不是数据库表真正的主键,它可以是一个唯一键,甚至连唯一键都可以不是(如果不是唯一键或主键,就可以批量删除数据),大家更新实际的场景做选择即可,我们这里以幢表的zhdjdydm(幢登记单元代码)字段作为删除条件。
2.1 实现对dsj_zhuangs表的删除
要通过API平台删除数据库表的数据,那么需要定义一个delete请求的路由,由于delete请求无法以请求体的方式发送json报文,因此只能把入参放到url后面。调用ADI平台实现删除操作的报文结构如下:
java
primarykey={"tablename":[{"key1":"value1","key2":"value2"},{"key1":"value11","key2":"value2"}]}
primarykey是固定参数名(要么全部小写,要么全部大写),它的值是一个json对象,json对象的格式和咱们之前数据库记录插入或修改类似。
对于我们的幢表,请求参数应该如下:
java
primarykey={"dsj_zhuangs":[{"zhdjdydm":"110108001001GB00001F0002"}]}
json对象的根节点必须有一个和表名相同的节点名称,即dsj_zhuangs(大小写不敏感),且节点下必须包含主键字段名和字段值;dsj_zhuangs节点可以是一个json对象(意味着只能删除单个幢的记录)或者是一个json数组(意味着可以删除多个幢的记录)。
2.1.1 在API平台定义一个DELETE路由
路由编码可定义为deleteZhuang2dsj,意思是删除大数据平台的幢数据。如图:
注意调用方式选择delete。
2.1.2 在路由下定义一个分享设置
在分享设置中填写大数据平台的数据库(即目标库)连接方式。如图:
2.1.3 在分享设置中定义目标库的数据库表
点击分享设置后面的[表定义],在表定义界面点击[新增],填写以下字段,如图:
注意这里的主键字段要填写zhdjdydm,因为我们要根据已知的zhdjdydm来删除表记录。
2.1.4 调用接口完成幢表数据删除
打开在线接口文档,如图所示:
我们填写以下json数据:
java
{"dsj_zhuangs":[{"zhdjdydm":"110108001001GB00001F0002"}]}
为了演示,我们选择了一个下面没有户信息的幢,确保可以删除成功;如果幢下面有户信息,那么我们应该先删除户信息,再删除幢信息,否则会因为外键而报错。
点击[试一下],如图所示:
可以看到接口调用成功了,再看看dsj库里数据是否被删除了:
幢数据被成功删除。
值得一提的是,删除操作不会去校验我们传入的主键值在数据库表中是否存在,即使不存在也不会报错。
3.复合主键单表删除户数据
所谓复合主键,是指我们要根据这个表的某几个字段作为where条件,来删除对应的数据库记录;我们这里以户表的zhdjdydm(幢登记单元代码)和hdjdydm(户登记单元代码)字段作为删除条件。
3.1 实现对dsj_hus表的修改
这里我们演示删除幢登记单元代码为110108001001GB00001F0001、户登记单元代码为110108001001GB00001F00010004的户信息,报文结构如下:
java
{"dsj_hus":[{"zhdjdydm":"110108001001GB00001F0001","hdjdydm":"110108001001GB00001F00010004"}]}
3.1.1 在API平台定义一个DELETE路由
路由编码可定义为deleteHu2dsj,意思是删除大数据平台的户数据。如图:
注意调用方式选择delete。
3.1.2 在路由下定义一个分享设置
这里顺便给大家介绍一下分享设置的导入导出功能,通过分享设置的导入导出功能,可以把A环境(比如测试环境)的分享设置导入到B环境(比如生产环境),也可以把A路由的分享设置导入到B路由,极大的减少您配置的工作量。
我们上篇文章定义的修改户信息的分享设置和这里要定义的删除户信息的分享设置基本一致,因此,我们先导出那个分享设置,如图:
得到导出的json配置信息,如图:
然后打开路由deleteHu2dsj的分享设置列表,点击[导入],如图:
把刚才导出的json配置信息复制粘贴到这里,点击[导入分享设置],如图:
导入成功:
注意红框中的内容,需要您自行修改为与当前分享设置对应功能匹配的描述。例如我把分享编码由updateHu2dsj改为deleteHu2dsj,把分享名称由"修改大数据平台的户数据"改为"删除大数据平台的户数据"。
3.1.3 调用接口完成户表数据删除
打开在线接口文档,如图所示:
我们填写以下json数据:
java
{"dsj_hus":[{"zhdjdydm":"110108001001GB00001F0001","hdjdydm":"110108001001GB00001F00010004"}]}
点击[试一下],如图所示:
可以看到接口调用成功了,再看看dsj库里数据是否被删除了:
户数据被成功删除。
4.多表删除(整合前两者)
所谓多表删除,是指我们通过一个接口实现对多张表的删除操作。我们前续文章已经知道如何实现多表插入、多表修改、多表删除也是相同的道理,我们只需要在一个分享设置下进行表定义的时候把这些表都定义进去即可。
唯一需要您知道的是,当多表删除时,我们的报文应该是这样的:
java
{"dsj_zhuangs":[{"zhdjdydm":"110108001001GB00001F0001"}],"dsj_hus":[{"zhdjdydm":"110108001001GB00001F0001","hdjdydm":"110108001001GB00001F00010004"}]}
在定义表的时候,户表的操作顺序应该小于幢表,也就是说要先删户表的记录,再删幢表的记录,避免外键关联导致的报错。
5.总结
到这里,对单主键单表、复合主键单表、多表的删除功能介绍就完成了,无论是哪一种,只要是一个分享设置下的操作,都会确保在同一个事务中执行,一旦发生异常都会自动回滚。另外,我们这里演示的都是手工组装报文进行测试,在实际工作中,大家可以参考上一篇文章的方式,通过API平台自动组装报文并完成数据修改。
后续我将继续介绍ADI平台其它的重要功能,谢谢大家的阅读!