PostgreSQL中實(shí)現(xiàn)自增的三種方式舉例
PG中實(shí)現(xiàn)自增字段的三種方式:
- 標(biāo)識(shí)列 (IDENTITY)
- 序列 (SEQUENCE)
- Serial類型
自增字段主要用于實(shí)現(xiàn)自增主鍵或生成唯一版本號(hào)
1.1 標(biāo)識(shí)列 (IDENTITY)
標(biāo)識(shí)列是SQL標(biāo)準(zhǔn)推薦實(shí)現(xiàn)自增的方式
示例
CREATE TABLE t_user ( user_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY , user_name varchar(50) NOT NULL UNIQUE ) INSERT INTO t_user (user_name) value ('tony')
說明:
創(chuàng)建一個(gè)名為
t_user
的表 CREATE TABLE t_user ()字段
user_id
為integer類型 user_id integer定義為標(biāo)識(shí)列且總是按照標(biāo)識(shí)列生成(由系統(tǒng)生成) GENERATED ALWAYS AS IDENTITY
定義為主鍵 PRIMARY KEY
字段
user_name
為varchar類型約束其不為空且唯一 NOT NULL UNIQUE
插入一條數(shù)據(jù) INSERT INTO t_user (user_name) value (‘tony’)
由于
user_id
是使用標(biāo)識(shí)列實(shí)現(xiàn)的自增主鍵 由系統(tǒng)賦值 因此插入時(shí)只需指定user_name
的值即可
原理
定義標(biāo)識(shí)列之后系統(tǒng)后臺(tái)會(huì)自動(dòng)創(chuàng)建并維護(hù)一個(gè)名為tablename_column_seq
的序列 基于此序列生成自增數(shù)據(jù)
-- SEQUENCE: public.t_user_user_id_seq -- DROP SEQUENCE IF EXISTS public.t_user_user_id_seq; CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1; ALTER SEQUENCE public.t_user_user_id_seq OWNER TO postgres;
表刪除后序列隨之刪除 該實(shí)現(xiàn)方式下表和序列是關(guān)聯(lián)關(guān)系 DROP TABLE t_user
1.2 序列 (SEQUENCE)
通過定義序列的方式實(shí)現(xiàn)自增字段 需要在創(chuàng)建表之前先定義一個(gè)序列
示例
先定義序列
CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 NO CYCLE
說明:
- 創(chuàng)建一個(gè)名為表名_自增字段名_seq的序列
CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq
- 參數(shù):
INCREMENT 1
:序列每次自增多少START 1
:從1開始MINVALUE 1
:序列的最小值MAXVALUE 2147483647
:序列的最大值CACHE 1
:緩存序列 但是服務(wù)器重啟之后緩存會(huì)丟失NO CYCLE / CYCLE
:是否循環(huán) 序列增長到最大值之后是否從新開始NO CYCLE
表示不重新開始
再創(chuàng)建表
CREATE TABLE t_user ( user_id integer DEFAULT nextval('t_user_user_id_seq') PRIMARY KEY , user_name varchar(50) NOT NULL UNIQUE )
說明:
? DEFAULT nextval('t_user_user_id_seq')
:默認(rèn)值為t_user_user_id_seq
序列的下一個(gè)值
nextval(‘序列’)——獲取序列的下一個(gè)值
currval(‘序列’)——獲取序列的當(dāng)前值
刪除表時(shí)序列不會(huì)隨之刪除 仍會(huì)保留下來
刪除語句:DROP SEQUENCE IF EXISTS public.t_user_user_id_seq;
1.3 Serial
示例
CREATE TABLE t_user ( user_id serial PRIMARY KEY , user_name varchar(50) NOT NULL UNIQUE )
原理
系統(tǒng)自動(dòng)生成一個(gè)序列與表相關(guān)聯(lián)
CREATE TABLE IF NOT EXISTS public.t_user ( user_id integer NOT NULL DEFAULT nextval('t_user_user_id_seq'::regclass), user_name character varying(50) COLLATE pg_catalog."default" NOT NULL, CONSTRAINT t_user_pkey PRIMARY KEY (user_id), CONSTRAINT t_user_user_name_key UNIQUE (user_name) )
刪除表時(shí)序列會(huì)隨之一起刪除
附:修改已有表主鍵為自增
已有表結(jié)構(gòu)
CREATE TABLE student ( id int4 PRIMARY KEY, name VARCHAR );
創(chuàng)建序列:代碼中的1表示此主鍵從1開始,注意:如果項(xiàng)目中的表已經(jīng)有數(shù)據(jù),那么START 后邊的數(shù)字一定要比數(shù)據(jù)庫中的主鍵字段的最大值要大或者相同
CREATE SEQUENCE student_id_seq START 1;
修改主鍵默認(rèn)值
ALTER TABLE student ALTER COLUMN id SET DEFAULT nextval('student_id_seq'::regclass);
總結(jié)
到此這篇關(guān)于PostgreSQL中實(shí)現(xiàn)自增的三種方式的文章就介紹到這了,更多相關(guān)PostgreSQL實(shí)現(xiàn)自增方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL 恢復(fù)誤刪數(shù)據(jù)的操作
這篇文章主要介紹了PostgreSQL 恢復(fù)誤刪數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL中調(diào)用存儲(chǔ)過程并返回?cái)?shù)據(jù)集實(shí)例
這篇文章主要介紹了PostgreSQL中調(diào)用存儲(chǔ)過程并返回?cái)?shù)據(jù)集實(shí)例,本文給出一創(chuàng)建數(shù)據(jù)表、插入測(cè)試數(shù)據(jù)、創(chuàng)建存儲(chǔ)過程、調(diào)用創(chuàng)建存儲(chǔ)過程和運(yùn)行效果完整例子,需要的朋友可以參考下2015-01-01PostgreSQL實(shí)現(xiàn)一個(gè)通用標(biāo)簽系統(tǒng)
這篇文章主要給大家介紹了關(guān)于利用PostgreSQL實(shí)現(xiàn)一個(gè)通用標(biāo)簽系統(tǒng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01PostgreSQL查找并刪除重復(fù)數(shù)據(jù)的方法總結(jié)
這篇文章主要給大家介紹了PostgreSQL查找并刪除重復(fù)數(shù)據(jù)的方法,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一點(diǎn)的幫助,需要的朋友可以參考下2023-10-10PostgreSQL表膨脹監(jiān)控案例(精確計(jì)算)
這篇文章主要介紹了PostgreSQL表膨脹監(jiān)控案例(精確計(jì)算),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01常用?PostgreSQL?預(yù)防數(shù)據(jù)丟失解決方案
這篇文章主要介紹了常用?PostgreSQL?預(yù)防數(shù)據(jù)丟失方案,本篇主要介紹關(guān)于?DDL?和?DML?操作,如何預(yù)防數(shù)據(jù)丟失的方案,需要的朋友可以參考下2022-01-01postgresql 賦權(quán)語句 grant的正確使用說明
這篇文章主要介紹了postgresql 賦權(quán)語句 grant的正確使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01使用postgresql獲取當(dāng)前或某一時(shí)間段的年月日
這篇文章主要給大家介紹了關(guān)于使用postgresql獲取當(dāng)前或某一時(shí)間段的年月日的相關(guān)資料,在PostgreSQL中可以使用函數(shù) NOW() 來查詢當(dāng)前時(shí)間,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07