Обновите таблицу, чтобы сделать повторяющиеся значения уникальными

#sql #postgresql

Вопрос:

У меня есть таблица с существующими данными, к которой необходимо добавить первичный ключ. Прежде чем я смогу добавить первичный ключ, мне нужно проверить существующий столбец на наличие дубликатов и изменить их, чтобы при изменении таблицы все мои первичные ключи были уникальными.

Пример таблицы:

Имя ID
Джон 123456
Стив 123456
Келли 122445
Сэм 122567
Зажимной патрон 123456

Возможно ли создать запрос, который может обновить строки Стива и Чака новым уникальным идентификатором? Я работаю с большим объемом данных, поэтому обновление вручную невозможно.

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

1. Создайте последовательность , начиная с max(id) 1 . Используйте nextval из этой последовательности для замены дубликатов идентификаторов.

2. О, круто. Отличная идея — я попробую, спасибо!

Ответ №1:

Если порядок name полей для вас не имеет значения, просмотрите этот пример:

Данные перед обновлением:

ID имя пользователя
123456 Джон
123456 Стив
122445 Келли
122567 Сэм
123456 Зажимной патрон
123712 Сара
123845 Брайан
123712 Пол

Функция обновления:

 CREATE OR REPLACE FUNCTION test.update_table_ids()
RETURNS void
LANGUAGE plpgsql
AS $function$
declare 
    max_id integer; 
begin

    select max(id) into max_id from test.sample1;

    update test.sample1 up  
    set 
        id = tmp.new_id 
    from 
        (
            select 
                a1.*, 
                ((ROW_NUMBER () OVER ())::integer   max_id) as new_id 
            from test.sample1 a1 
            inner join 
                (
                    select min(id) as id, min(first_name) as first_name from test.sample1
                    group by id 
                    having count(*) > 1 
             
                ) a2 on a1.id = a2.id 
            where a1.first_name <> a2.first_name
        ) tmp 
    where up.id = tmp.id and up.first_name = tmp.first_name;

end;
$function$
;
 

После обновления:

ID имя пользователя
122445 Келли
122567 Сэм
123456 Зажимной патрон
123845 Брайан
123712 Пол
123846 Джон
123847 Стив
123848 Сара