我有一个表中有假数据,有40,000行,每行的时间戳增加几毫秒。我想把这些行乘以10,每一行40,000行增加一天,一小时,无论我设定的是多少。向表本身添加表数据,增加时间戳
有没有办法从表中选择数据,然后将其反馈回自己,其中一列稍有变化?
FWIW,这张桌子上有33列。
任何帮助表示赞赏!
我有一个表中有假数据,有40,000行,每行的时间戳增加几毫秒。我想把这些行乘以10,每一行40,000行增加一天,一小时,无论我设定的是多少。向表本身添加表数据,增加时间戳
有没有办法从表中选择数据,然后将其反馈回自己,其中一列稍有变化?
FWIW,这张桌子上有33列。
任何帮助表示赞赏!
来自gustavotkg的mysql代码沿着正确的线条。
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>
对于多个副本重复不同的间隔。
目前还不清楚您是要更新行还是同时选择它们,或者甚至插入新行。更新是很简单的:(!更新状态)
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;
或新型writable CTEs略快于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之后手动。
是!谢谢。由于独特的ID约束和日期范围约束,我不得不做一些本地调整,但这基本上工作。 – Smittles