在没有 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)
我有一个从 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)