概述
回写是指通过系统提供的回写规则,将当前电子表格数据写入到指定的数据库中。
回写库、回写表:用于存储当前报表数据的目标数据库、数据表。
目前已知暂不支持回写的数据库类型有 hbase、impala、sparksql、hive、Kylin。
bytehouse数据库作为回写库注意事项:
1、需要配置回写的报表为bytehouse的分布式表,并且分布式表需要配置参数remote_table_is_ha_unique = 1,如:CREATE TABLE db.tablename ( xxx String , xxx String ) ENGINE = Distributed ( 'bytehouse', 'db', 'tablename' ) SETTINGS remote_table_is_ha_unique = 1
2、smartbi配置的主键必须和bytehouse配置的唯一键匹配,否则会导致执行删除语句失败
3、bytehouse数据库不支持文件字段类型,如BOLB
4、在smartbi中,smartbi只会执行插入语句,因此配置的主键本质上是失效的,因此无法实现以下效果:
1)更新某一条记录的唯一键:如:update table set id = ? where id=?
2)依据smartbi配置的主键对数据库进行更新。如:update table set name = ? where createtime = ?
操作流程
实现当前报表数据回写的完整操作流程如下:
实现原理
回写规则设置的主键实质上就是标志位或称为条件(即where部分),用于作为sql语句的查询条件。
设置电子表格和回写表字段的关联关系,在前端浏览时进行回写操作(修改数据、插入/删除数据)后,报表数据与回写表对应字段的数据进行比对:
1. 更新和插入
在“回写规则”>“回写方式设置”中可以切换不同的“更新和插入”方式。
具体关于各个选项的具体实现原理如下:
1.1. 执行更新和插入
① 通过点击“添加行”新增的数据,前端记录为“插入”操作,执行“insert”语句,如下:
insert into 表名(字段1, 字段2, 字段3) values(字段1的值, 字段2的值, 字段3的值)
当回写表为空时(即表中无数据),在报表中仍然会保留一行空白行。
这一行视为插入的新行,在其中填入内容不会执行更新操作。
② 当有数据进行变更,前端记录为“更新”操作,根据其主键的值作为查询条件去执行“update”语句,如下:
update 表名 set 字段1=手工填写的字段1新值, 字段2=手工填写的字段2新值…… where 主键字段1=值1, 主键字段2=值2……
1.2. 只执行更新
前端不管是“插入”还是“更新”操作,都根据其主键的值作为查询条件去执行“update”语句;
如下:
update 表名 set 字段1=字段1的值, 字段2=字段2的值…… where 主键字段1=值1, 主键字段2=值2……
1.3. 只执行插入
前端不管是“插入”还是“更新”操作,都是执行“insert”语句;
如下:
insert into 表名(字段1, 字段2, 字段3) values(字段1的值, 字段2的值, 字段3的值)
1.4. 强制先执行更新再执行插入
对每一个操作记录,都是默认先将设置的主键作为where条件去执行一次更新操作,满足更新的where语句则进行更新,不满足则执行插入操作
简单示例演示,现有回写表 test ,主键为“id”,表结构如下所示:
id | name | sex |
---|---|---|
1 | 李华 | 男 |
2 | 小明 | 男 |
3 | 小红 | 女 |
在报表前端做以下操作:
- 点击“添加行”新增数据:id=“4”,name="阿强",sex=“男”;
- 修改 id = 2 所在行数据的“name“,原始值为“小明”,现修改为“郝明”;
- 修改 id = 3 所在行数据的“name“,原始值为“小红”,现修改为“涂红”;
点击“保存”后,数据库层面的操作如下:
# 目前不存在id为4的行数据,不满足查询条件,返回0 update test set name="郝明", sex="男" where id=4; # 执行插入 insert into test(id, name, sex) values(4, "阿强", "男"); # 目前存在id为2的行数据,执行更新 update test set name="郝明" where id=2; # 目前存在id为3的行数据,执行更新 update test set name="涂红" where id=3;
2. 删除
“删除”操作的具体实现原理:通过点击“删除行”删除的数据,前端记录为“删除”操作,根据其主键的值作为查询条件去执行“delete”语句;
delete from 表名称 where 列名称 = 值
注意:回写功能只支持“分组表”,不支持“Excel融合分析”、“清单表”。