欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

設(shè)置PostgreSQL表字段為自增主鍵的方法

 更新時間:2025年10月13日 09:51:52   作者:勇往直前plus  
本文主要介紹了如何在數(shù)據(jù)庫中復(fù)制表結(jié)構(gòu)及數(shù)據(jù),并設(shè)置新表的自增主鍵,同時,文章討論了利用 PostgreSQL 的窗口函數(shù) ROW_NUMBER() 實現(xiàn)去重的方法,即保留重復(fù)記錄中的一條,其他設(shè)置為無效或刪除,此外,還提到了復(fù)制表時需要手動添加約束和索引,需要的朋友可以參考下

前言

最近公司的項目遇到多次這樣的需求:需要將原表符合條件的記錄復(fù)制到新表,但原表的主鍵字段在新表中需轉(zhuǎn)為普通字段。這篇博客主要介紹如何為新表設(shè)置自增主鍵字段。還有一個是如何利用窗口函數(shù)將表中某幾個字段值重復(fù)的記錄只保留一條有效,其余重復(fù)記錄作廢或者刪除,這個需求也是最近經(jīng)常遇到

設(shè)置自增主鍵

  • 我們經(jīng)常碰到這樣的場景,通過create table as select xxx from table where xx需要將原表符合條件的記錄復(fù)制到新表,值得注意的是這樣新創(chuàng)建的表,并沒有將表結(jié)構(gòu)復(fù)制到新表,原表的主鍵字段在新表中是一個普通字段
  • 首先,先確保當(dāng)前表中沒有主鍵以及當(dāng)前要設(shè)置主鍵字段的字段類型。
  • 第一步,要在pg數(shù)據(jù)庫中創(chuàng)建一個序列,序列是PostgreSQL實現(xiàn)自增功能的核心數(shù)據(jù)庫對象,用處就是字段值可以設(shè)置為由已創(chuàng)建的序列提供,每次序列可以自增生成一個唯一的整數(shù),我們可以設(shè)置序列的初始值和步長
	-- 序列名稱最好以表名_id_sq
CREATE SEQUENCE [IF NOT EXISTS] sequence_name
    [ INCREMENT BY increment ]
    [ START WITH start ]
    [ ... ] -- 其他參數(shù)如 MINVALUE, MAXVALUE, CACHE, CYCLE

因此,我們首先要知道當(dāng)前要設(shè)置為主鍵字段的最大值,如果當(dāng)前字段的最大值為100,那么序列的初始值就要設(shè)為101,步長默認是1,一般不需要設(shè)置步長

-- 先查出當(dāng)前字段的最大值
select max(id) from table_name
-- 創(chuàng)建序列,指定初始值和步長
CREATE SEQUENCE table_name_id_seq
START WITH 100
INCREMENT BY 1;

當(dāng)然,如果序列創(chuàng)建錯了,也可以直接修改已存在序列地初始值和步長

-- 修改序列初始值為500
ALTER SEQUENCE table_name_id_seq RESTART WITH 500;
-- 修改序列步長為5
ALTER SEQUENCE table_name_id_seq INCREMENT BY 5;

下一步,就是指定字段的數(shù)值來源為已創(chuàng)建的序列,由序列提供字段數(shù)值

ALTER TABLE table_name ALTER COLUMN id SET DEFAULT nextval('table_name_id_seq ');

最后,為字段添加主鍵約束即可

ALTER TABLE table_name ADD PRIMARY KEY (id);

去重

我們經(jīng)常碰到的數(shù)據(jù)庫需求就是根據(jù)某幾個字段,對重復(fù)記錄去重,只保留一條,其余作廢(valid=0)或者刪除,在pg數(shù)據(jù)庫,一般我們通過窗口函數(shù)ROW_NUMBER()實現(xiàn)這個功能

UPDATE table_name
SET valid = '0'
WHERE ctid IN (
    SELECT ctid
    FROM (
        SELECT
            ctid,
            ROW_NUMBER() OVER (PARTITION BY field1, field2, field3 ORDER BY ctid) AS rn
        FROM table_name
    ) AS ranked_rows
    WHERE rn > 1  -- 將過濾條件放在正確的外層
);

這段sql核心是通過窗口函數(shù)ROW_NUMBER()將同組(重復(fù)記錄集合)的記錄編號,然后保留編號最小的一個,編號>1的記錄作廢來實現(xiàn)去重的目的

UPDATE table_name
SET valid = '0'
WHERE ctid IN (
    SELECT ctid
    FROM (
        SELECT
            ctid,
            ROW_NUMBER() OVER (PARTITION BY field1, field2, field3 ORDER BY ctid) AS rn
        FROM table_name
    ) AS ranked_rows
    WHERE rn > 1  -- 將過濾條件放在正確的外層
);

ROW_NUMBER() OVER (...) AS rn??: 這行代碼是核心。ROW_NUMBER()是一個窗口函數(shù),它會為每一行分配一個唯一的序號

PARTITION BY field1, field2, field3??: PARTITION BY子句定義了如何將數(shù)據(jù)分組。這里表示??將 field1, field2, field3這三個字段完全相同的記錄歸為同一組??。窗口函數(shù)會在每個組內(nèi)獨立進行編號

ORDER BY ctid??: 這指定了在每個分組內(nèi),記錄按 ctid排序。ctid是 PostgreSQL 系統(tǒng)列,代表行的物理位置(文件號和頁內(nèi)的元組索引),可以理解為每行的唯一物理標(biāo)識。按此排序意味著??在同一分組內(nèi),先插入的行(理論上ctid更小)會獲得更小的行號

表復(fù)制

僅復(fù)制表結(jié)構(gòu)(不復(fù)制數(shù)據(jù))

-- 基本用法,復(fù)制列定義(包括NOT NULL約束)
CREATE TABLE new_table (LIKE old_table);

-- 擴展用法,復(fù)制包括索引、約束等更多對象
CREATE TABLE new_table (LIKE old_table INCLUDING ALL);

復(fù)制表結(jié)構(gòu)及其所有數(shù)據(jù)

記得要注意,表的約束、索引等并沒有復(fù)制,需要手動重新添加

-- 標(biāo)準語法
CREATE TABLE new_table AS SELECT * FROM old_table;

-- 簡化語法,效果相同
CREATE TABLE new_table AS TABLE old_table;

以上就是設(shè)置PostgreSQL表字段為自增主鍵的方法的詳細內(nèi)容,更多關(guān)于PostgreSQL表字段為自增主鍵的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PostgreSQL容器磁盤I/O監(jiān)控與優(yōu)化指南

    PostgreSQL容器磁盤I/O監(jiān)控與優(yōu)化指南

    在數(shù)據(jù)庫運維工作中,磁盤 I/O 性能直接影響著 PostgreSQL 的查詢響應(yīng)速度和事務(wù)處理能力,本文給大家介紹了PostgreSQL容器磁盤I/O監(jiān)控與優(yōu)化指南,需要的朋友可以參考下
    2025-05-05
  • postgresql兼容MySQL on update current_timestamp問題

    postgresql兼容MySQL on update current_timestamp

    這篇文章主要介紹了postgresql兼容MySQL on update current_timestamp問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • PostgreSQL中擴展moddatetime的使用

    PostgreSQL中擴展moddatetime的使用

    PostgreSQL的moddatetime擴展通過觸發(fā)器自動維護時間戳字段,輕量高效,適用于審計日志和多租戶系統(tǒng),具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • 詳解PostgreSql數(shù)據(jù)庫對象信息及應(yīng)用

    詳解PostgreSql數(shù)據(jù)庫對象信息及應(yīng)用

    這篇文章主要介紹了PostgreSql數(shù)據(jù)庫對象信息及應(yīng)用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • PostgreSQL運維案例之遞歸查詢死循環(huán)解決方案

    PostgreSQL運維案例之遞歸查詢死循環(huán)解決方案

    PostgreSQL提供的遞歸語法是很棒的,例如可用來解決樹形查詢的問題,解決Oracle用戶connect by的語法兼容性,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL運維案例之遞歸查詢死循環(huán)解決方案的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • navicat連接postgresql、人大金倉等數(shù)據(jù)庫報錯解決辦法

    navicat連接postgresql、人大金倉等數(shù)據(jù)庫報錯解決辦法

    在使用Navicat操作數(shù)據(jù)庫時,遇到數(shù)據(jù)報錯是一個常見的問題,這類問題可能涉及多個方面,下面這篇文章主要給大家介紹了關(guān)于navicat連接postgresql、人大金倉等數(shù)據(jù)庫報錯的解決辦法,需要的朋友可以參考下
    2024-08-08
  • PostgreSql生產(chǎn)級別數(shù)據(jù)庫安裝要注意事項

    PostgreSql生產(chǎn)級別數(shù)據(jù)庫安裝要注意事項

    這篇文章主要介紹了PostgreSql生產(chǎn)級別數(shù)據(jù)庫安裝要注意事項,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會多出一個空格的問題

    解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會多出一個空格的問題

    這篇文章主要介紹了解決postgresql 數(shù)字轉(zhuǎn)換成字符串前面會多出一個空格的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 教你在PostgreSql中使用JSON字段的方法

    教你在PostgreSql中使用JSON字段的方法

    這篇文章主要介紹了干貨教你在PostgreSql中使用JSON字段,通過本文可掌握在pg數(shù)據(jù)庫中如何正確使用json字段,如何進行數(shù)據(jù)查詢,在where子查詢中如何使用,以及對json值進行聚合查詢使用,需要的朋友可以參考下
    2022-11-11
  • 深入理解PostgreSQL 事務(wù)處理

    深入理解PostgreSQL 事務(wù)處理

    PostgreSQL事務(wù)處理確保數(shù)據(jù)一致性,支持四種隔離級別,處理臟讀、不可重復(fù)讀和幻讀問題,并可通過會話或配置文件設(shè)置,自動提交默認開啟,感興趣的可以了解一下
    2025-06-06

最新評論