SQL Server INSERT в таблицу, только если записи не существуют в целевой таблице

У нас есть список из 50 таблиц в «SQL Server-A» на «PC-A» и те же 50 таблиц в «SQL server-B» на «PC-B», оба соединены вместе в сети.

«SQL server-A» выступает в роли промежуточной, так как напрямую связан с датчиками. Программа python пытается перенести все данные из 50 таблиц в «SQL Server-A» в «SQL Server-B» каждый час («каждый час, данные за последние 2 часа будут передаваться постепенно»). При передаче, как избежать вставки строки в таблицы «SQL Server-B», если строка уже существует в таблицах?

Ранее мы использовали PostgreSQL вместо «сервера-B». Мы использовали массовый перенос данных за 2 часа в таблицу «Temp» PostgreSQL, а затем из таблицы «Temp» мы вставляем в фактическую таблицу с запросом «при конфликте ничего не делать». Каков его эквивалент в SQL Server?

Например: таблица в «Сервер-А» и БД: БД-1 и Таблица: Таблица-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

Таблица в «Сервере-B» и БД: БД-1 и Таблица: Таблица-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

Нужно вставить только идентификаторы 4 и 5 в таблицу 1 DB-1 на сервере B и пропустить идентификаторы 1,2 и 3. Как лучше всего передать это в SQL, поскольку таблицы на сервере B содержат миллионы строк?

Используйте EXISTS и отфильтруйте данные, которые вы не хотите INSERT/UPDATE.

Larnu 17.03.2022 11:49

таблица назначения огромна. это лучший способ сделать массовый перенос всех 50 столов каждый час?

Nandan 17.03.2022 11:56

Дайте определение «огромному», @Nandan. SQL Server может тривиально обрабатывать миллионы строк в одном операторе. При условии, что ваши столбцы первичного ключа правильно проиндексированы, EXISTS будет очень производительным. Однако, если вы хотите копировать данных, то, на мой взгляд, вам следует обратить внимание на зеркалирование/репликацию.

Larnu 17.03.2022 12:01

Каждая из 50 таблиц содержит более 15 тысяч строк, и со временем она будет увеличиваться. если я проверю EXISTS первичного ключа. смогу ли я вводить 5000 строк каждый час для всех 50 таблиц?

Nandan 17.03.2022 12:24

Я не знаю, что такое «лакх», но если это не означает 10 миллионов или более, у SQL Server не возникнет проблем с обработкой этих нескольких строк.

Larnu 17.03.2022 12:32

(Я мог бы поклясться, что снова открыл это после того, как закрыл его. Кофе не закипел достаточно, чтобы напомнить мне, что я поставлю его золотым значком, когда внес предложение. Извиняюсь. Время для второго кофе)

Larnu 17.03.2022 12:43

@Larnu - «Лакх» - это термин из Индии. Значит 10**5, или 100_000.

Gord Thompson 17.03.2022 14:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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?

Для PostgreSQL INSERT с ON CONFLICT DO NOTHING лайком

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

(один столбец PK на id) эквивалент в T-SQL будет

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

Является ли решение, предоставленное для T-SQL «WHERE id NOT IN (SELECT id FROM tbl_main)», лучшим способом, или есть ли какая-либо другая процедура, которую я могу сделать, чтобы работать еще лучше?

Nandan 18.03.2022 05:11

Другие вопросы по теме