Неясно, хотите ли вы просто обновить строки или выбрать их одновременно или даже вставить новые строки.Обновление очень просто:
UPDATE tbl
SET col1 = col1*10
,ts = ts + interval '1 day'
Чтобы также возвращать все строки, как если бы оператор SELECT
(обновленное состояние!):
UPDATE tbl
SET col1 = col1*10
, ts = ts + interval '1 day'
RETURNING *
Если вы действительно хотите INSERT
новые строки с одним измененным столбцом и измененной отметкой времени, и точка должна быть , избегая необходимости набирать все 33 столбца , вы можете:
CREATE TEMP TABLE tbl_tmp AS SELECT * FROM tbl;
UPDATE tbl_tmp SET col1 = col1*10, ts = ts + interval '1 day';
INSERT INTO tbl SELECT * FROM tbl_tmp;
DROP tbl_tmp;
ИЛИ несколько быстрее с новыми записываемыми CTE в версии 9.1:
CREATE TEMP TABLE ON COMMIT DROP tbl_tmp AS SELECT * FROM tbl;
WITH x AS (
UPDATE tbl_tmp SET col1 = col1*10, ts = ts + interval '1 day'
RETURNING *
)
INSERT INTO tbl SELECT * FROM x;
DROP tbl_tmp;
Убедитесь, что autovacuum запущен или работает VACUUM ANALYZE вручнуюпосле этого.