SQL 仅当目标 table 中不存在记录时,服务器才插入 table
SQL Server INSERT into table only if records do not exist in destination table
我们在“PC-A”的“SQL Server-A”中有 50 tables 的列表,在“SQL 服务器中有相同的 50 tables “PC-B”中的“-B”都在网络中连接在一起。
"SQL server-A" 充当分段,因为它直接与传感器相连。一个 python 程序试图每小时将“SQL Server-A”中 50 tables 的所有数据传输到“SQL Server-B”(“每小时,最后 2 小时的数据将以增量方式传输”)。传输时,如果行已经存在于table中,如何避免在“SQL Server-B”table中插入行?
之前我们使用 PostgreSQL 代替“server-B”。我们使用批量传输 2 小时数据到 PostgreSQL“Temp”table,然后从“Temp”table 插入到实际 table,查询“on Conflict do nothing” .它在 SQL 服务器中的等价物是什么?
例如:table in "Server-A" and DB : DB-1 & Table: 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
Table 在“Server-B”和数据库中:DB-1 & Table: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 的 Table-1 中插入 ID 4 & 5 并跳过 ID 1,2 & 3。在 SQL,因为 Server-B 中的 table 拥有数百万行?
Earlier we used PostgreSQL in place "server-B". We used bulk transfer 2 hour data to PostgreSQL "Temp" table and then from "Temp" table we insert to actual table with query "on Conflict do nothing". What is its equivalent in SQL Server?
对于带有 ON CONFLICT DO NOTHING
的 PostgreSQL INSERT,比如
INSERT INTO tbl_main (id, txt)
SELECT id, txt FROM tbl_temp
ON CONFLICT DO NOTHING
(single-column PK on id
) T-SQL 中的等价物是
INSERT INTO tbl_main (id, txt)
SELECT id, txt FROM tbl_temp
WHERE id NOT IN (SELECT id FROM tbl_main)
我们在“PC-A”的“SQL Server-A”中有 50 tables 的列表,在“SQL 服务器中有相同的 50 tables “PC-B”中的“-B”都在网络中连接在一起。
"SQL server-A" 充当分段,因为它直接与传感器相连。一个 python 程序试图每小时将“SQL Server-A”中 50 tables 的所有数据传输到“SQL Server-B”(“每小时,最后 2 小时的数据将以增量方式传输”)。传输时,如果行已经存在于table中,如何避免在“SQL Server-B”table中插入行?
之前我们使用 PostgreSQL 代替“server-B”。我们使用批量传输 2 小时数据到 PostgreSQL“Temp”table,然后从“Temp”table 插入到实际 table,查询“on Conflict do nothing” .它在 SQL 服务器中的等价物是什么?
例如:table in "Server-A" and DB : DB-1 & Table: 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
Table 在“Server-B”和数据库中:DB-1 & Table: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 的 Table-1 中插入 ID 4 & 5 并跳过 ID 1,2 & 3。在 SQL,因为 Server-B 中的 table 拥有数百万行?
Earlier we used PostgreSQL in place "server-B". We used bulk transfer 2 hour data to PostgreSQL "Temp" table and then from "Temp" table we insert to actual table with query "on Conflict do nothing". What is its equivalent in SQL Server?
对于带有 ON CONFLICT DO NOTHING
的 PostgreSQL INSERT,比如
INSERT INTO tbl_main (id, txt)
SELECT id, txt FROM tbl_temp
ON CONFLICT DO NOTHING
(single-column PK on id
) T-SQL 中的等价物是
INSERT INTO tbl_main (id, txt)
SELECT id, txt FROM tbl_temp
WHERE id NOT IN (SELECT id FROM tbl_main)