#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 | Сара |