Добавьте данные таблицы к себе, увеличив отметку времени - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть таблица с фиктивными данными в ней, 40000 строк и отметка времени в каждой строке, которая увеличивается на несколько миллисекунд.Я хочу умножить эти строки, скажем, на 10, при этом каждые 40000 строк будут увеличиваться на день и час, независимо от того, что я установил.

Есть ли способ выбрать данные из таблицы и затем передать их обратно в себя с небольшим изменением одного столбца?

FWIW, в этой таблице 33 столбца.

Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Код mysql от gustavotkg находится вдоль правильных линий.

INSERT INTO mytable (event_ts, col1, col2)
SELECT event_ts + interval '1 day', col1, col2
FROM mytable
WHERE event_ts BETWEEN <something> AND <something else>

Повторите с разными интервалами для нескольких копий.

0 голосов
/ 02 декабря 2011

Неясно, хотите ли вы просто обновить строки или выбрать их одновременно или даже вставить новые строки.Обновление очень просто:

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 вручнуюпосле этого.

...