Эффективно дублируйте некоторые строки в таблице PostgreSQL

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

Однако я также хочу получить сопоставление от старых идентификаторов к новым. Есть ли лучший способ сделать это, чем просто сначала запрашивать строки для копирования, а затем вставлять новые строки по одной?

По сути, я хочу сделать что-то вроде этого:

INSERT INTO my_table (col1, col2, col3)
SELECT col1, 'new col2 value', col3
FROM my_table old
WHERE old.some_criteria = 'something'
RETURNING old.id, id;

Однако это не удается с ОШИБКА: отсутствует запись в предложении FROM для таблицы "old" , и я могу понять, почему: Postgres должен сначала выполнить SELECT, а затем вставить его, а предложения RETURNING имеют доступ только к вновь вставленной строке .

9
задан Erwin Brandstetter 25 March 2015 в 19:31
поделиться