簡體   English   中英

用自動遞增的 id 替換兩列(名字,姓氏)

[英]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_namelast_name經常重復。 1M 行中只有 100 種組合。 因此,為了節省磁盤空間,我正在考慮創建一個單獨的people表,其中包含列(id, first_name, last_name)其中(first_name, last_name)是一個唯一約束,以便將時間序列位置表簡化為(time, person_id, loc_lat, loc_long)其中person_idpeople表的外鍵。

我想首先從我現有的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM