Postgresql + заполнение таблицы данными на основе уже существующих записей в этой же таблице

Есть таблица modes в которой есть атрибуты
link, name , antoherAtrr.

link, name - строковые значения.

Задача состоит в том, чтобы выполнить запрос всех имеющихся строк в таблице и умножить их на N-количество, и сделать вставку в эту же таблицу, но при этом, чтобы поля link, name - имели уникальное значение(например, добавить к существующим значениям в этих полях + рандомное число в виде строки).

insert into modes (link, name , antoherAtrr)
                                 select * from modes

Данный код выдаст ошибку, так как нарушается уникальность первых 2-х столбцов.

У кого есть идеи как это написать ? Можете привести код с пояснениями ?

Update.

Вот что мне предложили сделать.

INSERT INTO modes (link, name)
SELECT mod.link || '_'||serial_sequence.range, mod.name || '_'||serial_sequence.range
FROM modes mod
         JOIN generate_series(1, 10) AS serial_sequence(range) ON true;

(1, 10) - это диапазон генерации. Здесь можно подставить любое количество записей, которое вы хотите увеличить. Я не совсем разобрался как он работает, иногда не срабатывал.

Решение рабочее ( оно не мое).


Ответы (1 шт):

Автор решения: Alexander Pavlov

Сделать можно вот так

insert into modes (link, name , antoherAtrr)
select
    link||'_'||row_number() over (partition by link, name),
    name||'_'||row_number() over (partition by link, name),
    'text'
from modes

но я на 146% уверен, что ты неправильно решаешь какую-то задачу.


insert into modes (link, name , antoherAtrr) values ('1', 'a', null);
insert into modes (link, name , antoherAtrr) values ('1', 'b', null);
insert into modes (link, name , antoherAtrr) values ('2', 'a', null);
insert into modes (link, name , antoherAtrr) values ('2', 'b', null);

insert into modes (link, name , antoherAtrr)
select
    link||'_'||row_number() over (partition by link, name),
    name||'_'||row_number() over (partition by link, name),
    ids::text
from modes cross join (select 1 id union select 2 union select 3) ids

select * from modes
link    name    antoheratrr
1   a   
1   b   
2   a   
2   b   
1_1 a_1 (1)
1_2 a_2 (2)
1_3 a_3 (3)
1_1 b_1 (1)
1_2 b_2 (2)
1_3 b_3 (3)
2_1 a_1 (1)
2_2 a_2 (2)
2_3 a_3 (3)
2_1 b_1 (1)
2_2 b_2 (2)
2_3 b_3 (3)
→ Ссылка