![](/img/trans.png)
[英]PostgreSQL last inserted ID not auto-increment typescript sequelize
[英]Replacing two columns (first name, last name) with an auto-increment id
我有一個時間序列位置 data.table,其中包含以下列(time, first_name, last_name, loc_lat, loc_long)
,前三列作為主鍵。 該表有超過 100 萬行。
我注意到first_name
和last_name
經常重復。 1M 行中只有 100 種組合。 因此,為了節省磁盤空間,我正在考慮創建一個單獨的people
表,其中包含列(id, first_name, last_name)
其中(first_name, last_name)
是一個唯一約束,以便將時間序列位置表簡化為(time, person_id, loc_lat, loc_long)
其中person_id
是people
表的外鍵。
我想首先從我現有的 1M 行表中創建一個新表,以測試此更改是否確實節省了有意義的磁盤空間。 我覺得這個任務是完全可行的,但還沒有找到具體的方法。 有什么建議么?
這是數據庫規范化的基本步驟。
如果您負擔得起,編寫一個交換 ID 的全名的新表比更改現有表的架構並更新所有行要快。 基本上:
BEGIN; -- wrap in single transaction (optional, but safer)
CREATE TABLE people (
people_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY
, first_name text NOT NULL
, last_name text NOT NULL
, CONSTRAINT full_name_uni UNIQUE (first_name, last_name)
);
INSERT INTO people (first_name, last_name)
SELECT DISTINCT first_name, last_name
FROM tbl
ORDER BY 1, 2; -- optional
ALTER TABLE tbl RENAME TO tbl_old; -- free up org. table name
CREATE TABLE tbl AS
SELECT t.time, p.people_id, t.loc_lat, t.loc_long
FROM tbl_old t
JOIN people p USING (first_name, last_name);
-- ORDER BY ??
ALTER TABLE tbl ADD CONSTRAINT people_id_fk FOREIGN KEY (people_id) REFERENCES people(people_id);
-- make sure the new table is complete. indexes? constraints?
-- Finally:
DROP TABLE tbl_old;
COMMIT;
有關的:
DISTINCT
很簡單。 但是對於只有 100 個不同的全名——並且有正確的索引支持——還有更復雜的。 (多)更快的方法:見:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.