在没有 ID 的情况下尽可能制作 INSERT INTO as error/duplicate 证明

Making an INSERT INTO as error/duplicate proof as possible without ID

我有一个从 tableA 插入到 tableB 的存储过程。每次程序执行时(因为 tableA 会不断更新,所以当程序 运行 时,它会将缺失的数据添加到 B),它会将 A 的全部内容插入到B 不管怎样。

所以在插入中我添加了一个 WHERE 语句来根据添加记录时的时间戳过滤 "older data" (插入新记录,其中 tableA 的时间戳更大比 tableB 上的那个)。 table 没有唯一标识符,所以我有点坚持让过滤器尽可能安全,基本上我唯一可以考虑的是时间戳。我已经尝试了一些解决方法,但它们都有缺点(在每个代码块中都有评论)。

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE (SELECT MAX(TIMESTAMP) FROM TABLEB) < (SELECT MAX(TIMESTAMP) FROM TABLEA)

--THIS DOESN'T EVEN WORK
INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)

--IF RUN TWICE IT WILL RUN ON RECORDS CONTAINING TIMESTAMPS WITH THOSE VALUES
INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)
      AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEA)

--THIS WILL EFFECTIVELY SKIP RECORDS WITH THE TIMESTAMP FROM TABLEA BUT RUN TWICE WILL DUPLICATES THE ONES WITH TIMESTAMP FROM B

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)
      AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEA)
      AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEB)

--THIS WILL SKIP DATA WITH THE TIMESTAMP FROM B

感谢任何有关在 运行 中生成并跳过重复行的逻辑的帮助。

我不确定你的问题是什么,但这应该有效。你查看最后插入的是什么 Table B 然后得到所有新记录。

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE TIMESTAMP > (SELECT MAX(TIMESTAMP) FROM TABLEB)

在 table A 的每次插入中插入所有记录的成本非常高。如果您使用的是 T-SQL(sql 服务器),则可以使用 "Scope_Identity" 命令。您需要在同一调用中的两个 table 中添加每条记录。将值添加到 table A,然后添加到 table B.

举个例子:

INSERT INTO TABLEA (column-names) 
VALUES (values)

DECLARE @LAST_RECORD_ID INT=0

SELECT @LAST_RECORD_ID = SCOPE_IDENTITY()

INSERT INTO TABLEB (column-names) 

SELECT 
    (column-names)
FROM TABLEA WHERE TABLEA.ID = @LAST_RECORD_ID

您需要在 table A 中有一个时间戳类型的版本列,在 table B 中有一个类型为 varbinary(8) 的对应列。有了这个假设,下面的代码必须工作:

INSERT INTO TABLEB (VALUES)
    SELECT A.VALUES
    FROM A 
    WHERE A.Version > (SELECT MAX(Version) FROM TABLEB)