如何在FDbatchmove组件追加数据操作中排除主键字段?
FDBatchMove追加数据时排除主键字段解决UNIQUE约束冲突
[FireDac][Phys][SQLite] ERROR: UNIQUE constraint failed:AG2.M_key 异常的触发原因是批量导入时将源表的M_key主键值写入目标表,和目标表现有主键值重复,或和目标表主键自增序列生成的值冲突。排除M_key字段让目标表自行生成主键值即可解决,有两种可直接落地的实现方案:
方案1:通过字段映射排除主键(推荐)
不需要修改源数据集的查询逻辑,直接通过FDBatchMove的映射规则过滤主键字段:
- 关闭自动映射:将FDBatchMove组件的
Options.AutoMapFields属性设为False,避免组件自动把所有字段(包括M_key)做映射 - 清空默认生成的映射列表,手动添加需要同步的字段映射,跳过M_key即可
运行时代码示例:FDBatchMove1.Mappings.Clear; // 按 源字段名=目标字段名 的格式,添加所有非主键字段的映射 FDBatchMove1.Mappings.Add('col_a=col_a'); FDBatchMove1.Mappings.Add('col_b=col_b'); FDBatchMove1.Mappings.Add('col_c=col_c'); // 其余非主键字段按相同规则补充 FDBatchMove1.Execute; - 如果是设计期配置,直接双击FDBatchMove组件打开Mappings编辑器,选中M_key对应的映射条目删除即可。
方案2:从源数据集层面过滤主键
如果不需要保留源表的M_key值,直接修改源数据集的查询语句,不查询M_key字段即可:
- 将源FDQuery/FDTable的查询SQL从
SELECT * FROM 源表改为SELECT 非主键字段1,非主键字段2,... FROM 源表,完全不返回M_key字段 - 保持
Options.AutoMapFields := True,组件会自动映射查询返回的所有字段,不会写入目标表的M_key字段,目标表会按自身主键规则自动生成合法的M_key值。
注意:如果AG2表的M_key不是自增字段,排除字段前需确认M_key设置了默认值生成规则(比如触发器、默认值函数),否则会触发非空约束错误。
内容的提问来源于stack exchange,提问作者A.K.D.
相关产品推荐
相关产品推荐

