Я не думаю, что вы хотите попытаться объединить многоэлементные массивы в строку или что-то в этом роде, «CSV в столбце» - это хорошо известный анти-паттерн, который приводит только к боли и страданию.Вам было бы лучше преобразовать многоэлементные массивы в несколько строк.В комментариях вы говорите, что FK не ссылаются на эту таблицу, поэтому вам не нужно беспокоиться о создании новых строк.
Вы можете сделать это пошагово.Сначала разверните массивы, чтобы разделить столбцы, используя unnest
и боковое соединение:
insert into emails (user_id, user_email_id)
select user_id, array[eid]
from emails,
unnest(user_email_id) as dt(eid)
where array_length(user_email_id, 1) > 1
Это даст вам что-то вроде этого:
id | user_id | user_email_id
----+---------+---------------
65 | 1 | {98,110}
66 | 1 | {99}
X1 | 1 | {98}
X2 | 1 | {110}
, где X1
и X2
строки пришли из 65
.
Затем избавьтесь от только что расширенных строк:
delete from emails
where array_length(user_email_id, 1) > 1
, чтобы получить:
id | user_id | user_email_id
----+---------+---------------
66 | 1 | {99}
X1 | 1 | {98}
X2 | 1 | {110}
И, наконец,ALTER COLUMN с предложением USING для замены массивов:
alter table emails
alter column user_email_id
type int using user_email_id[1]
Это оставит вас с:
id | user_id | user_email_id
----+---------+---------------
66 | 1 | 99
X1 | 1 | 98
X2 | 1 | 110