delphi - 使用 FireDac 仅更新重复行中的 1 个(无主键或唯一字段)
问题描述
我有一个我支持的旧应用程序,它使用 Microsoft Access 数据库。最初的表设计并没有为每个表添加主键。我正在开发一个迁移程序,其中包括在需要时添加和填写新的主键字段 (GUID)。
这分三个步骤进行:
- 添加一个没有约束的新 guid 字段
- 用新的独特指南填充该领域
- 添加主键约束
我的问题是当表有重复行时设置唯一的 guid。这是我设置指南的代码。
Query.SQL.Add('SELECT * FROM ' + TableName);
Query.Open;
while Query.Eof = false do
begin
Query.Edit;
Query.FieldByName(NewPrimaryKeyFieldName).AsGuid := TGuid.NewGuid;
Query.Post;
Query.Next;
end;
FireDac 生成一个更新语句,其中包含一个 where 子句,其中包含行中的所有原始字段/值(因为它没有唯一的字段可供使用)。但是,由于行是完全重复的,该语句仍会更新两行。
FireDac 正确错误地显示此消息
Update command updated [2] instead of [1] record.
我可以在 Access 中打开数据库并删除重复的记录,或者通过编辑表格为它们分配一个唯一的 guid。我希望我的转换工具能够自动执行此操作。
有没有办法在 FireDac 中处理这些重复的行?一次只更新一个,还是只删除其中一个?
解决方案
在我看来,仅使用一条 SQL 语句是无法做到的。
我会这样做: 1. 使用新的临时表复制整个表而不重复
SELECT DISTINCT * FROM <TABLENAME>
- 添加密钥
- 删除旧表格内容并从新表格中复制新内容
笔记:
对于该操作,其他所有人都应该无法使用数据库 2.之前进行备份
推荐阅读
- android - 同一个sql表中的子id和父id映射
- php - 使用 PHP 登录后使用异步内容抓取网站
- python - AttributeError:'function'对象没有属性'read'
- node.js - 无法从我的 VS Code 扩展 (node.js) 连接到 SQL Server
- c++ - 错误 2552:无法使用初始化列表初始化非聚合
- python - 如何使大小为 [64, 3, 128, 128] 和 [64, 64, 127, 127] 的两个张量的维度相等
- python - 字典的长度不一样
- python - zero-mq如何获取队列容量和负载
- java - java.lang.NoClassDefFoundError: com/codename1/ui/ComponentSelector
- visual-studio-code - VSCode:用en-和em破折号替换多个连字符