Postgres upsert (обновление и вставка) из другой таблицы успешно, но значение идентификатора дублируется для одного значения

#postgresql

#postgresql

Вопрос:

Я пытаюсь перенести ДАННЫЕ из одной таблицы в другую таблицу.В них есть несколько повторяющихся значений.Первая таблица выглядит так, таблица-a:

  id | deviceserial | time_difference
---- -------------- -----------------
  1 | 636363636891 |               3
  2 | 636363636890 |             123
  3 | 6625839827   |              29
  4 | 6625839832   |              60
  5 | 6625839830   |             120
  6 | 6625839828   |               4
  7 | 6625839833   |              60

 
 Another table name table-b:
id | deviceserial | time_difference
---- -------------- -----------------
  1 | 636363636891 |               3
  2 | 636363636890 |             123
  3 | 6625839835   |              60
  4 | 6625839827   |              29
  5 | 6625839832   |              60
  6 | 6625839830   |             120
  7 | 6625839828   |               4
  8 | 6625839833   |              60
 

Я пытаюсь выполнить UPSERT из таблицы-b в таблицу-a с помощью приведенного ниже запроса:

 INSERT INTO table-a (id,deviceSerial,time_difference) SELECT id,deviceSerial,time_difference FROM table-b ON CONFLICT (deviceserial) DO  UPDATE SET time_difference=device_usage1.time_difference   excluded.time_difference;
 

Я получаю этот результат.

 id | deviceserial | time_difference
---- -------------- -----------------
  1 | 636363636891 |               6
  2 | 636363636890 |             246
  3 | 6625839835   |              60
  3 | 6625839827   |              58
  4 | 6625839832   |             120
  5 | 6625839830   |             240
  6 | 6625839828   |               8
  7 | 6625839833   |             120
 

Его обновление и вставка успешно.Но один идентификатор дублируется (не дублируется deviceSerial ).В чем может быть причина?

Комментарии:

1. MySQL или Postgresql? Пожалуйста, отметьте только соответствующую базу данных.

2. @ArunPalanisamy, его Postgresql и отредактирован .

3. Почему id оно не должно дублироваться? Согласно запросу, вы только предотвращаете дублирование deviceserial s.

4. @xehpuk вы правы. Но, если я добавлю id и deviceSerial, которые не должны дублироваться в запросе, это даст мне неверный результат.

Ответ №1:

Попробуйте исключить id из вашего SELECT . Предполагая id table-a , что значение автоматически увеличивается, при вставке новых значений будет сгенерирован новый уникальный идентификатор.

 INSERT INTO table-a (id,deviceSerial,time_difference)
SELECT deviceSerial,time_difference FROM table-b 
ON CONFLICT (deviceserial) DO 
UPDATE SET time_difference=device_usage1.time_difference   excluded.time_difference;
 

Я настоятельно рекомендую добавить ограничение id , если вы хотите обеспечить уникальность. Это похоже на первичный ключ таблицы. Вы также можете id полностью отказаться и просто использовать deviceSerial в качестве первичного ключа, поскольку кажется, что значение также должно быть уникальным.