Postgresql

向表中添加新的 BIGSERIAL 列時,可以指定生成值的順序嗎?

  • April 14, 2022

我需要在BIGSERIAL一個巨大的表(約 30 億條記錄)中添加一個新列。這個問題與我需要做的類似,並且接受的答案對我有所幫助。但我仍然想知道一些事情。就我而言,該表已經有一個BIGSERIAL作為主鍵的列,但是許多行已被刪除,所以現在有gaps。(該表隨後被完全清空。)我需要重新生成這些值,以便它們再次是連續的。以下是我想要實現的 5 個範例行new_value > 1000

+---------+---------+
|old_value|new_value|
+---------+---------+
|1026     |1001     |
|1027     |1002     |
|1030     |1003     |
|1032     |1004     |
|1039     |1005     |
+---------+---------+

CREATE TABLE ... 我已經成功地實施了上面引用的答案(然後)中提到的替代方法INSERT INTO new_table SELECT * FROM ...,但我也想嘗試並以最初的建議為基準。然而,問題是我不知道是否new_value會以**與 the 相同的順序生成,**因為old_value這是一個要求。

當使用如下語句添加列時,如何確保new_value列的順序遵循/跟踪列的順序:old_value``new_value

ALTER TABLE existing_table ADD COLUMN new_value BIGSERIAL;

不同的方法

我還嘗試了以下操作(在小桌子上效果很好),但它比在非常大的桌子上引用答案的替代建議要慢得多:

ALTER TABLE existing_table ADD COLUMN new_value BIGINT NOT NULL DEFAULT 0;

UPDATE existing_table AS existing
SET new_value = generated.new_id
FROM (
     SELECT original.old_value
          , row_number() OVER (ORDER BY original.old_value) AS new_id
     FROM existing_table AS original
    ) generated
WHERE existing.old_value = generated.old_value;

首先,考慮評論中的建議:你真的需要消除差距嗎?通常,您不會。並且差距將重新出現。請參閱:

接下來,考慮對我一直在努力的舊答案的更新:

除其他外,如何避免為新表中的表數據寫入 WAL - 這將是進一步提高性能的最重要的位。

當使用如下語句添加列時,如何確保new_value列的順序遵循/跟踪列的順序:old_value``new_value

ALTER TABLE existing_table ADD COLUMN new_value BIGSERIAL;

你不能。使用其他路線之一。

我還嘗試了以下操作(在小桌子上效果很好),但它比在非常大的桌子上引用答案的替代建議要慢得多:

UPDATE路線本質上比從頭開始編寫原始新表(之後添加索引約束)更昂貴。

引用自:https://dba.stackexchange.com/questions/310879