繁体   English   中英

SQL 仅当目标表中不存在记录时才向表中插入服务器

[英]SQL Server INSERT into table only if records do not exist in destination table

我们在“PC-A”中的“SQL Server-A”中有 50 个表的列表,在“PC-B”中的“SQL Server-B”中有相同的 50 个表都在网络中连接在一起。

“SQL server-A”充当分段,因为它直接与传感器相连。 一个 python 程序试图每小时将“SQL Server-A”中的 50 个表的所有数据传输到“SQL Server-B”(“每小时,最后 2 小时的数据将以增量方式传输”)。 传输时,如果表中已存在行,如何避免在“SQL Server-B”表中插入行?

之前我们使用 PostgreSQL 代替“server-B”。 我们使用批量传输 2 小时数据到 PostgreSQL“Temp”表,然后从“Temp”表插入到实际表中,查询“on Conflict do nothing”。 它在 SQL 服务器中的等价物是什么?

例如:“Server-A”和DB中的表:DB-1 & 表:Table-1【这里“ID”列为主键】

ID Name Value       Timestamp 
1   X    12    2022-02-14 09:46:24.840 
2   Y    15    2022-02-14 09:47:24.840
3   A    35    2022-02-14 09:48:24.840
4   B    56    2022-02-14 09:49:24.840
5   C    86    2022-02-14 09:50:24.840

“Server-B”和 DB 中的表:DB-1 & 表:Table-1

ID Name Value       Timestamp 
1   X    12    2022-02-14 09:46:24.840 
2   Y    15    2022-02-14 09:47:24.840
3   A    35    2022-02-14 09:48:24.840

只需要在服务器 B 的 DB-1 的表 1 中插入 ID 4 和 5,并跳过 ID 1,2 和 3。在 SQL 中传输它的最佳方法是什么,因为服务器 B 中的表有数百万行数?

之前我们使用 PostgreSQL 代替“server-B”。 我们使用批量传输 2 小时数据到 PostgreSQL“Temp”表,然后从“Temp”表插入到实际表中,查询“on Conflict do nothing”。 它在 SQL 服务器中的等价物是什么?

对于 PostgreSQL INSERT with ON CONFLICT DO NOTHING like

    INSERT INTO tbl_main (id, txt)
    SELECT id, txt FROM tbl_temp
    ON CONFLICT DO NOTHING

id上的单列 PK)T-SQL 中的等价物是

    INSERT INTO tbl_main (id, txt)
    SELECT id, txt FROM tbl_temp
    WHERE id NOT IN (SELECT id FROM tbl_main)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM