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 шт):
Сделать можно вот так
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)