Вместо удаления из Таблицы1 вы могли бы использовать LEFT JOIN
вместо того, чтобы определить, какие строки не существуют в Таблице1, а затем вставить все новые данные одновременно, что приведет только к одному запросу, а не двум:
INSERT INTO Table1
SELECT Table2.* FROM Table2 LEFT JOIN Table1
ON Table2.pk1 = Table1.pk1
AND Table2.pk2 = Table1.pk2
AND Table2.pk3 = Table1.pk3
WHERE Table1.pk1 IS NULL
Любые данные таблицы 1, которые не соответствуют всем требованиям, указанным в параметрах левого соединения, будут возвращены как NULL
- поэтому в операторе WHERE
необходим только один столбец pk.
РЕДАКТИРОВАТЬ: Поскольку вы хотите обновить новые значения в уже существующие строки, вы можете заменить WHERE Table1.pk1 IS NULL
на следующее:
ON DUPLICATE KEY UPDATE Table1.X = Table2.X, Table1.Y = Table2.Y etc.
Предполагается, что к вашим трем значениям pk уже применен уникальный индекс (это должен быть ваш первичный ключ), а если нет, примените к своей таблице следующее:
ALTER TABLE Table1
ADD CONSTRAINT pk_idx PRIMARY KEY (pk1, pk2, pk3);
Дайте мне знать, если вам нужно что-нибудь еще:)