#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
в качестве первичного ключа, поскольку кажется, что значение также должно быть уникальным.