使用 FireDac 仅更新重复行中的 1 个(无主键或唯一字段)
Using FireDac to update only 1 of a duplicate row (no primary key or unique field)
我有一个我支持的旧应用程序,它使用 Microsoft Access 数据库。最初的 table 设计并没有为每个 table 添加主键。我正在开发一个迁移程序,其中包括在需要时添加和填写新的主键字段 (GUID)。
这分三个步骤进行:
- 添加一个没有约束的新 guid 字段
- 用新的唯一 guid 填充字段
- 添加主键约束
我的问题是当 table 有重复的行时设置唯一的 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 子句,行中包含所有原始 fields/values(因为没有唯一字段供其使用)。但是,因为行完全重复,所以该语句仍会更新两行。
FireDac 使用此消息正确出错
Update command updated [2] instead of [1] record.
我可以在 Access 中打开数据库并删除重复记录或通过编辑 table 为它们分配唯一的 guid。我希望我的转换工具能够自动执行此操作。
有什么方法可以在 FireDac 中处理这些重复的行吗?一次只更新一个,还是只删除其中一个?
在我看来,只用一个 SQL 声明是不可能做到的。
我会这样做:
1. 使用新的临时 table
复制整个 table,不重复
SELECT DISTINCT * FROM <TABLENAME>
- 添加密钥
- 删除旧 table 内容并从新 table
复制新内容
备注:
对于该操作,其他所有人都不应使用该数据库
2. 在
之前制作备份
我有一个我支持的旧应用程序,它使用 Microsoft Access 数据库。最初的 table 设计并没有为每个 table 添加主键。我正在开发一个迁移程序,其中包括在需要时添加和填写新的主键字段 (GUID)。
这分三个步骤进行:
- 添加一个没有约束的新 guid 字段
- 用新的唯一 guid 填充字段
- 添加主键约束
我的问题是当 table 有重复的行时设置唯一的 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 子句,行中包含所有原始 fields/values(因为没有唯一字段供其使用)。但是,因为行完全重复,所以该语句仍会更新两行。
FireDac 使用此消息正确出错
Update command updated [2] instead of [1] record.
我可以在 Access 中打开数据库并删除重复记录或通过编辑 table 为它们分配唯一的 guid。我希望我的转换工具能够自动执行此操作。
有什么方法可以在 FireDac 中处理这些重复的行吗?一次只更新一个,还是只删除其中一个?
在我看来,只用一个 SQL 声明是不可能做到的。
我会这样做: 1. 使用新的临时 table
复制整个 table,不重复SELECT DISTINCT * FROM <TABLENAME>
- 添加密钥
- 删除旧 table 内容并从新 table 复制新内容
备注:
对于该操作,其他所有人都不应使用该数据库 2. 在
之前制作备份