将一些表记录复制到同一张表中会产生一些问题

Posted

技术标签:

【中文标题】将一些表记录复制到同一张表中会产生一些问题【英文标题】:Copy some table records into the same table make some problems 【发布时间】:2021-05-05 07:41:35 【问题描述】:
DEFINE BUFFER bfSource FOR tableA.
DEFINE BUFFER bfTarget FOR tableA.

DO FOR bfTarget TRANSACTION:
    FOR EACH bfSource  WHERE  bfSource.user_id = 0 NO-LOCK:
        CREATE bfTarget.
        BUFFER-COPY bfSource  EXCEPT id TO bfTarget.
        ASSIGN 
            bfTarget.user_id = 1.
    END.
END.

当我使用此查询时,最后一次迭代可能会随机产生一些问题。 AVM 尝试查找下一条记录,但它们没有,有时 AVM 会找到新创建的记录(在 user_id 为 0 之前)。我有一些想法来防止这种情况,可怕的发现,错误,但我不知道什么是最好的做法。我也尝试过更改事务范围的位置,但没有任何效果。

【问题讨论】:

发布您遇到的错误有助于找出问题所在。一般来说,对于显示模式(字段和索引)的表(db 或 temp-)的问题也很有帮助。 这只是一个例子,我没有收到任何错误,即使只有 id 字段并且没有缓冲区复制也可能会出现问题。在最后一次迭代中,我复制了先前创建的记录,因为 avm 在 id 0 之前找到它。 【参考方案1】:

目前我的解决方案是:

DEFINE BUFFER bfSource FOR tableA.
DEFINE BUFFER bfTarget FOR tableA.

REPEAT PRESELECT EACH bfSource WHERE bfSource.user_id = 0 NO-LOCK:
    FIND NEXT bfSource.
    DO FOR bfTarget TRANSACTION:
        CREATE bfTarget.
        BUFFER-COPY bfSource  EXCEPT id TO bfTarget.
        ASSIGN 
            bfTarget.user_id = 1.
    END.
END.

【讨论】:

您可以让ASSIGN 成为BUFFER-COPY 语句的一部分(bfTarget 之后的. 使其成为单独的语句。

以上是关于将一些表记录复制到同一张表中会产生一些问题的主要内容,如果未能解决你的问题,请参考以下文章

将一些数据从 sqlite 表复制到具有不同两列的同一个表中

在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

MYSQL从同一张表中选择不同的记录

根据同一张表的结果优化选择表中的所有行?