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 (каждая строка с самим собой), поэтому, когда вы вставляете хотя бы одну строку, условие "нет строки, равной себе", никогда не выполнялось.

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