使用FireDac仅更新重复行中的1个(无主键或唯一字段)

时间:2019-06-20 16:35:56

标签: delphi ms-access firedac delphi-10.2-tokyo

我有一个支持的旧应用程序,该应用程序使用Microsoft Access数据库。原始表设计并未将主键添加到每个表。我正在开发一个迁移程序,其中包括在需要时添加并填写新的主键字段(GUID)。

这发生在三个步骤中:

  1. 添加不受限制的新guid字段
  2. 用新的独特指南填充字段
  3. 添加主键约束

我的问题是当表中有重复的行时设置唯一的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中是否可以使用某些方式处理这些重复的行?一次只更新一个,还是只删除其中一个?

1 个答案:

答案 0 :(得分:2)

我认为仅凭一条SQL语句是无法做到的。

我会这样做:  1.使用新的临时表复制整个表,没有重复项

SELECT DISTINCT * FROM <TABLENAME>
  1. 添加密钥
  2. 删除旧表内容并从新表中复制新内容

注释:

该操作的所有其他用户都无法使用该数据库 2.先进行备份