您可能不希望這樣做,因爲gapless sequences are problematic for performance。
如果您想稍後將其作爲清理步驟,則可以使用rank()
窗口函數來實現所需的效果。
CREATE TABLE table1 (id integer primary key);
INSERT INTO table1 values (1),(2),(4),(5);
CREATE TABLE table2 (
id serial primary key,
rid integer references table1(id) ON UPDATE CASCADE
);
insert into table2 (rid) values (1),(1),(4),(4),(4),(5);
UPDATE table1
SET id = gapless_id
FROM (
SELECT *, row_number() OVER() FROM table1
) AS x(old_id, gapless_id)
WHERE id = x.old_id;
結果:
regress=# select * from table1 ;
id
----
1
2
3
4
(4 rows)
如果您的FK的不ON UPDATE CASCADE
可以ALTER TABLE
,使他們如此。這將會很慢,特別是如果外鍵沒有索引。更快的方法是做的修改在兩個通道:
- 開始事務
LOCK TABLE table1;
- 添加NEW_ID列於表1和使用
row_number()
新的ID填充它如上圖所示
- 降外鍵約束參照表1(ID)
- 更新所有外鍵參考值
new_id
- 下降
id
在TABL E1
- 表1的
new_id
列重命名爲id
- 重新創建外鍵約束
- 提交
是重要的保留一切凝結?如果您的數據庫中有1000條記錄,並且您刪除了記錄1,則至少有兩個額外的更新需要運行。 – thetaiko 2010-02-19 19:08:09
我正在談論更多關於你在桌面上做的事情,每天有很多插入/刪除操作,並像做每月維護任務一樣進行操作。 – Earlz 2010-02-19 19:09:03