摘要:中的序列是一個數(shù)據(jù)庫對象,本質(zhì)上是一個自增器。因此,序列在其他同類型數(shù)據(jù)庫軟件中以值的形式存在。注意字段的默認(rèn)值并不是強制使用的。用戶仍然可以手動插入值,這樣潛在地造成與未來的序列值沖突的風(fēng)險?,F(xiàn)在我們成功地執(zhí)行一次序列刪除來自
PostgreSQL 中的序列是一個數(shù)據(jù)庫對象,本質(zhì)上是一個自增器。因此,序列在其他同類型數(shù)據(jù)庫軟件中以 autoincrment 值的形式存在。在一張表需要非隨機,唯一標(biāo)實符的場景下,Sequence 非常有用。
Sequence 對象中包含當(dāng)前值,和一些獨特屬性,例如如何遞增(或者遞減)。實際上,Sequence 是不能被直接訪問到的;他們需要通過 PostgreSQL 中的相關(guān)函數(shù)來操作他們。
創(chuàng)建序列看看創(chuàng)建的語法:
CREATE SEQUENCE sequencename [ INCREMENT increment ] -- 自增數(shù),默認(rèn)是 1 [ MINVALUE minvalue ] -- 最小值 [ MAXVALUE maxvalue ] -- 最大值 [ START start ] -- 設(shè)置起始值 [ CACHE cache ] -- 是否預(yù)先緩存 [ CYCLE ] -- 是否到達最大值的時候,重新返回到最小值
Sequence 使用的是整型數(shù)值,因此它的取值范圍是 [-2147483647, 2147483647] 之間;現(xiàn)在我們創(chuàng)建一個簡單的序列:
pigdb> CREATE SEQUENCE shipments_ship_id_seq MINVALUE 0; CREATE SEQUENCE查看序列
psql 的 d 命令輸出一個數(shù)據(jù)庫對象,包括 Sequence,表,視圖和索引。你還可以使用 ds 命令只查看當(dāng)前數(shù)據(jù)庫的所有序列。例如:
pigdb-# ds List of relations Schema | Name | Type | Owner --------+-----------------------+----------+-------- public | author_ids | sequence | ichexw public | shipments_ship_id_seq | sequence | ichexw (2 rows)
Sequence 就像表和視圖一樣,擁有自己的結(jié)構(gòu),只不過它的結(jié)構(gòu)是固定的:
pigdb=# d shipments_ship_id_seq Sequence "public.shipments_ship_id_seq" Column | Type | Value ---------------+---------+----------------------- sequence_name | name | shipments_ship_id_seq last_value | bigint | 0 start_value | bigint | 0 increment_by | bigint | 1 max_value | bigint | 9223372036854775807 min_value | bigint | 0 cache_value | bigint | 1 log_cnt | bigint | 0 is_cycled | boolean | f is_called | boolean | f
我們現(xiàn)在查詢下 shipments_ship_id_seq 的 last_value(當(dāng)前的序列值)和 increment_by (當(dāng) nextval() 被調(diào)用,當(dāng)前值將會被增加)。
pigdb=# SELECT last_value, increment_by FROM shipments_ship_id_seq; last_value | increment_by ------------+-------------- 0 | 1 (1 row)
由于序列剛剛被創(chuàng)建,因此 last_value 被設(shè)置成 0。
使用序列我們需要知道的 Sequence 的函數(shù)使用:
nextval("sequence_name"): 將當(dāng)前值設(shè)置成遞增后的值,并返回 currval("sequence_name"): 返回當(dāng)前值 setval("sequence_name", n, b=true): 設(shè)置當(dāng)前值;b 默認(rèn)設(shè)置 true,下一次調(diào)用 nextval() 時,直接返回 n,如果設(shè)置 false,則返回 n+increment:
nextval() 函數(shù)要求一個序列名(必須由單引號包圍)為第一個參數(shù)。 需要注意的是,當(dāng)你第一次調(diào)用 nextval() 將會返回序列的初始值,即 START;因為他沒有調(diào)用遞增的方法。
pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 0 (1 row) pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 1 (1 row)
Sequence 一般作為表的唯一標(biāo)識符字段的默認(rèn)值使用(這是序列的最常見的場景);看個例子:
pigdb=# CREATE TABLE shipments (id integer DEFAULT nextval("shipments_ship_id_seq") PRIMARY KEY, customer_id integer, isbn text, ship_date timestamp); CREATE TABLE pigdb=# d shipments Table "public.shipments" Column | Type | Modifiers -------------+-----------------------------+------------------------------------------------------------- id | integer | not null default nextval("shipments_ship_id_seq"::regclass) customer_id | integer | isbn | text | ship_date | timestamp without time zone | Indexes: "shipments_pkey" PRIMARY KEY, btree (id)
這張表中的 id 字段的默認(rèn)值將被設(shè)置成 shipments_ship_id_seq 的 nextval() 值。如果插入值的時候,沒有指定 id 的值,將會自動選擇 nextval("shipments_ship_id_seq") 的值。
注意: id 字段的默認(rèn)值并不是強制使用的。用戶仍然可以手動插入值,這樣潛在地造成與未來的序列值沖突的風(fēng)險。這個可以通過 trigger 來防止這個問題,后續(xù)將詳細(xì)介紹。
為了防止同一個序列同時被多個被多個用戶訪問導(dǎo)致錯誤,序列的當(dāng)前值與 session 關(guān)聯(lián)。兩個用戶可能在兩個不同的會話訪問同一個序列,但是調(diào)用 currval() 時,只會返回同一會話下的當(dāng)前值。
現(xiàn)在看看 curval() 的簡單用法:
pigdb=# INSERT INTO shipments (customer_id, isbn, ship_date) VALUES (221, "0394800753", "now"); INSERT 0 1 pigdb=# SELECT * FROM shipments WHERE id = currval("shipments_ship_id_seq"); id | customer_id | isbn | ship_date ----+-------------+------------+---------------------------- 2 | 221 | 0394800753 | 2015-04-12 00:38:07.298688 (1 row)
另外,一個序列也可以通過 setval() 將 last_value 設(shè)置成任意值(必須在序列的取值范圍內(nèi))。這個要求一個序列名(必須由單引號包圍著)作為第一個參數(shù),以及要設(shè)置的最后值作為第二個參數(shù);看幾個例子:
pigdb=# SELECT setval("shipments_ship_id_seq", 1010); setval -------- 1010 (1 row) pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 1011 (1 row)
前文中,我們還提到了 setval() 的第三個參數(shù);現(xiàn)在把它設(shè)置成 false,驗證下效果:
pigdb=# SELECT setval("shipments_ship_id_seq", 1010, false); setval -------- 1010 (1 row) pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 1010 (1 row)
當(dāng)?shù)谌齻€參數(shù)設(shè)置成 false 的時候,就像重新創(chuàng)建序列時,第一次調(diào)用的時候,只是初始化 last_val,不會調(diào)用遞增函數(shù)。
刪除序列
你可以使用:
DROP SEQUENCE seq_name[, ...]
來刪除一個或者多個序列。命令中的 seq_name 是序列名,不須被引號包圍;如果是多個序列,可以使用逗號隔開。
現(xiàn)在我們試一下這個命令:
pigdb=# DROP SEQUENCE shipments_ship_id_seq; ERROR: cannot drop sequence shipments_ship_id_seq because other objects depend on it DETAIL: default for table shipments column id depends on sequence shipments_ship_id_seq HINT: Use DROP ... CASCADE to drop the dependent objects too.
這里報錯了,由于該序列被其他對象引用,因此無法直接刪除,除非你使用 DROP ... CASCADE。
我們可以使用下面的語句來查看的序列是否被數(shù)據(jù)庫中的其他對象引用,:
pigdb=# SELECT p.relname, a.adsrc FROM pg_class p JOIN pg_attrdef a on (p.relfilenode = a.adrelid) WHERE a.adsrc ~ "shipments_ship_id_seq"; relname | adsrc -----------+-------------------------------------------- shipments | nextval("shipments_ship_id_seq"::regclass) (1 row)
這里檢查到 shipments_ship_id_seq 序列被 shipments 引用。你可以把這個序列名替換成任何一個你像查看的序列;或者不添加任何條件查看當(dāng)前數(shù)據(jù)庫中所有序列的引用。
現(xiàn)在我們成功地執(zhí)行一次序列刪除:
pigdb=# DROP TABLE shipments; DROP TABLE pigdb=# DROP SEQUENCE shipments_ship_id_seq; DROP SEQUENCE
來自:http://n3xtchen.github.io
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/38924.html
摘要:數(shù)據(jù)類型類型轉(zhuǎn)換數(shù)值類型數(shù)值類型序列類型不同于的自增長,和都是序列的方式創(chuàng)建使用創(chuàng)建序列關(guān)聯(lián)列表架構(gòu)模式名稱類型擁有者數(shù)據(jù)表數(shù)據(jù)表序列數(shù)行記錄數(shù)據(jù) 數(shù)據(jù)類型 showImg(https://segmentfault.com/img/bVbi9mw?w=750&h=379);showImg(https://segmentfault.com/img/bVbi9mz?w=729&h=626)...
摘要:直接切換到對應(yīng)的庫下執(zhí)行注意,這個不能獲取到和的歸屬情況,只能獲取到表和序列的的情況上面的這個,能查出下面的這種歸屬的對于下面的這種情況,都查不出來的。表的是一個,表里面又有其它的授權(quán)非的下 直接切換到對應(yīng)的庫下執(zhí)行select nsp.nspname as SchemaName ,cls.relname a...
摘要:移動易后臺實現(xiàn)外部數(shù)據(jù)庫連接要實現(xiàn)外置數(shù)據(jù)庫,即上層開發(fā)人員不關(guān)心下層數(shù)據(jù)庫的實現(xiàn),在項目中需要針對不同數(shù)據(jù)庫修改文件以及在項目中添加依賴包。本文主要介紹移動易后臺如何實現(xiàn)同不同數(shù)據(jù)源的連接,數(shù)據(jù)源包括,。 1、移動易后臺實現(xiàn)外部數(shù)據(jù)庫連接 要實現(xiàn)外置數(shù)據(jù)庫,即上層開發(fā)人員不關(guān)心下層數(shù)據(jù)庫的實現(xiàn),在Spring boot項目 中需要針對不同數(shù)據(jù)庫修改application.proper...
摘要:它在其他開放源代碼數(shù)據(jù)庫系統(tǒng)和專有系統(tǒng)之外,為用戶又提供了一種選擇。將插入空間以填補任何額外的空間。始終被視為唯一值上述兩個約束的組合。表范圍的約束可以是,,或。如何在中創(chuàng)建表我們將創(chuàng)建一個名為的表,它定義了各種游樂場設(shè)備。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實踐干貨哦~ 本文由angel_郁 發(fā)表于云+社區(qū)專欄 什么是PostgreSQL? PostgreSQL是自由...
閱讀 1208·2021-09-22 15:32
閱讀 1790·2019-08-30 15:53
閱讀 3311·2019-08-30 15:53
閱讀 1468·2019-08-30 15:43
閱讀 518·2019-08-28 18:28
閱讀 2642·2019-08-26 18:18
閱讀 746·2019-08-26 13:58
閱讀 2588·2019-08-26 12:10