我有一個表中有假數據,有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