页面树结构
转至元数据结尾
转至元数据起始


概述

回写是指通过系统提供的回写规则,将当前电子表格数据写入到指定的数据库中。

回写库、回写表:用于存储当前报表数据的目标数据库、数据表。

目前已知暂不支持回写的数据库类型有 hbaseimpalasparksqlhive、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”,表结构如下所示:

idnamesex
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融合分析”、“清单表”。

  • 无标签