gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:56:17 25 4
gpt4 key购买 nike

我支持一个使用 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 中处理这些重复的行?是一次只更新一个,还是只删除其中一个?

最佳答案

在我看来,仅用一条 SQL 语句是无法做到这一点的。

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

SELECT DISTINCT * FROM <TABLENAME>
  • 添加 key
  • 删除旧表格内容并从新表格复制新内容
  • 注释:

    该数据库对于该操作的其他人应该不可用2.之前进行备份

    关于delphi - 使用 FireDac 仅更新 1 个重复行(无主键或唯一字段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56690427/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com