SQL INSERT без дубликатов (без первичных или уникальных ключей)
Давайте рассмотрим, что у меня есть таблица A, которую я использую для создания таблицы B. У меня нет первичного или уникального ключа, который я мог бы использовать для ON DUPLICATE KEY
,
Моя таблица B имеет 3 столбца: A, B и C.
я бы хотел INSERT
это только если строка уже не существует. Я могу определить, существует ли строка, является комбинацией A и B. Я использую WHERE NOT EXISTS
Заявление сделать это.
INSERT INTO TableB
(A, B, C)
SELECT
SUM(A),
SUM(B),
SUM(C)
FROM TableA
WHERE NOT EXISTS (SELECT * FROM TABLE B WHERE A=A AND B=B)
GROUP BY A, B
Если таблица B пуста, строка вставляется. Однако, как только в таблице B есть запись, строки не вставляются, даже если они еще не существуют в таблице B.
2 ответа
Я думаю, что лучший и более быстрый способ сделать это - применить UNIQUE
Ограничение на А + Б.
Alter TABLE TableB ADD CONSTRAINT unique_A_B UNIQUE(A,B);
Тогда используйте ON DUPLICATE KEY UPDATE
:
INSERT INTO TableB (A,B,C)
SELECT
SUM(A),
SUM(B),
SUM(C)
FROM TableA
GROUP BY A, B
ON DUPLICATE KEY UPDATE C=SUM(C);
Для примера я обновил C
но я думаю, что в реальной ситуации вы захотите обновить метку времени обновления строки с Now()
,
Вы должны поставить перед столбцами из внешнего запроса его псевдоним в подзапросе:
INSERT INTO TableB (A, B, C)
SELECT
SUM(A),
SUM(B),
SUM(C)
FROM TableA ta
WHERE NOT EXISTS (SELECT * FROM TableB tb WHERE tb.A=ta.A AND tb.B=ta.B)
GROUP BY A, B
То, как вы это написали, вы сравнивали значения из таблицы TableB
со значениями от TableB
(каждая строка с самим собой), поэтому, когда вы вставляете хотя бы одну строку, условие "нет строки, равной себе", никогда не выполнялось.