摘要:中的序列是一個(gè)數(shù)據(jù)庫對(duì)象,本質(zhì)上是一個(gè)自增器。因此,序列在其他同類型數(shù)據(jù)庫軟件中以值的形式存在。注意字段的默認(rèn)值并不是強(qiáng)制使用的。用戶仍然可以手動(dòng)插入值,這樣潛在地造成與未來的序列值沖突的風(fēng)險(xiǎn)。現(xiàn)在我們成功地執(zhí)行一次序列刪除來自
PostgreSQL 中的序列是一個(gè)數(shù)據(jù)庫對(duì)象,本質(zhì)上是一個(gè)自增器。因此,序列在其他同類型數(shù)據(jù)庫軟件中以 autoincrment 值的形式存在。在一張表需要非隨機(jī),唯一標(biāo)實(shí)符的場(chǎng)景下,Sequence 非常有用。
Sequence 對(duì)象中包含當(dāng)前值,和一些獨(dú)特屬性,例如如何遞增(或者遞減)。實(shí)際上,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 ] -- 是否到達(dá)最大值的時(shí)候,重新返回到最小值
Sequence 使用的是整型數(shù)值,因此它的取值范圍是 [-2147483647, 2147483647] 之間;現(xiàn)在我們創(chuàng)建一個(gè)簡(jiǎn)單的序列:
pigdb> CREATE SEQUENCE shipments_ship_id_seq MINVALUE 0; CREATE SEQUENCE查看序列
psql 的 d 命令輸出一個(gè)數(shù)據(jù)庫對(duì)象,包括 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)前值將會(huì)被增加)。
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() 時(shí),直接返回 n,如果設(shè)置 false,則返回 n+increment:
nextval() 函數(shù)要求一個(gè)序列名(必須由單引號(hào)包圍)為第一個(gè)參數(shù)。 需要注意的是,當(dāng)你第一次調(diào)用 nextval() 將會(huì)返回序列的初始值,即 START;因?yàn)樗麤]有調(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)識(shí)符字段的默認(rèn)值使用(這是序列的最常見的場(chǎng)景);看個(gè)例子:
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() 值。如果插入值的時(shí)候,沒有指定 id 的值,將會(huì)自動(dòng)選擇 nextval("shipments_ship_id_seq") 的值。
注意: id 字段的默認(rèn)值并不是強(qiáng)制使用的。用戶仍然可以手動(dòng)插入值,這樣潛在地造成與未來的序列值沖突的風(fēng)險(xiǎn)。這個(gè)可以通過 trigger 來防止這個(gè)問題,后續(xù)將詳細(xì)介紹。
為了防止同一個(gè)序列同時(shí)被多個(gè)被多個(gè)用戶訪問導(dǎo)致錯(cuò)誤,序列的當(dāng)前值與 session 關(guān)聯(lián)。兩個(gè)用戶可能在兩個(gè)不同的會(huì)話訪問同一個(gè)序列,但是調(diào)用 currval() 時(shí),只會(huì)返回同一會(huì)話下的當(dāng)前值。
現(xiàn)在看看 curval() 的簡(jiǎn)單用法:
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)
另外,一個(gè)序列也可以通過 setval() 將 last_value 設(shè)置成任意值(必須在序列的取值范圍內(nèi))。這個(gè)要求一個(gè)序列名(必須由單引號(hào)包圍著)作為第一個(gè)參數(shù),以及要設(shè)置的最后值作為第二個(gè)參數(shù);看幾個(gè)例子:
pigdb=# SELECT setval("shipments_ship_id_seq", 1010); setval -------- 1010 (1 row) pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 1011 (1 row)
前文中,我們還提到了 setval() 的第三個(gè)參數(shù);現(xiàn)在把它設(shè)置成 false,驗(yàn)證下效果:
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ù)谌齻€(gè)參數(shù)設(shè)置成 false 的時(shí)候,就像重新創(chuàng)建序列時(shí),第一次調(diào)用的時(shí)候,只是初始化 last_val,不會(huì)調(diào)用遞增函數(shù)。
刪除序列
你可以使用:
DROP SEQUENCE seq_name[, ...]
來刪除一個(gè)或者多個(gè)序列。命令中的 seq_name 是序列名,不須被引號(hào)包圍;如果是多個(gè)序列,可以使用逗號(hào)隔開。
現(xiàn)在我們?cè)囈幌逻@個(gè)命令:
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.
這里報(bào)錯(cuò)了,由于該序列被其他對(duì)象引用,因此無法直接刪除,除非你使用 DROP ... CASCADE。
我們可以使用下面的語句來查看的序列是否被數(shù)據(jù)庫中的其他對(duì)象引用,:
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 引用。你可以把這個(gè)序列名替換成任何一個(gè)你像查看的序列;或者不添加任何條件查看當(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/38924.html
摘要:數(shù)據(jù)類型類型轉(zhuǎn)換數(shù)值類型數(shù)值類型序列類型不同于的自增長(zhǎng),和都是序列的方式創(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)...
摘要:直接切換到對(duì)應(yīng)的庫下執(zhí)行注意,這個(gè)不能獲取到和的歸屬情況,只能獲取到表和序列的的情況上面的這個(gè),能查出下面的這種歸屬的對(duì)于下面的這種情況,都查不出來的。表的是一個(gè),表里面又有其它的授權(quán)非的下 直接切換到對(duì)應(yīng)的庫下執(zhí)行select nsp.nspname as SchemaName ,cls.relname a...
摘要:移動(dòng)易后臺(tái)實(shí)現(xiàn)外部數(shù)據(jù)庫連接要實(shí)現(xiàn)外置數(shù)據(jù)庫,即上層開發(fā)人員不關(guān)心下層數(shù)據(jù)庫的實(shí)現(xiàn),在項(xiàng)目中需要針對(duì)不同數(shù)據(jù)庫修改文件以及在項(xiàng)目中添加依賴包。本文主要介紹移動(dòng)易后臺(tái)如何實(shí)現(xiàn)同不同數(shù)據(jù)源的連接,數(shù)據(jù)源包括,。 1、移動(dòng)易后臺(tái)實(shí)現(xiàn)外部數(shù)據(jù)庫連接 要實(shí)現(xiàn)外置數(shù)據(jù)庫,即上層開發(fā)人員不關(guān)心下層數(shù)據(jù)庫的實(shí)現(xiàn),在Spring boot項(xiàng)目 中需要針對(duì)不同數(shù)據(jù)庫修改application.proper...
摘要:它在其他開放源代碼數(shù)據(jù)庫系統(tǒng)和專有系統(tǒng)之外,為用戶又提供了一種選擇。將插入空間以填補(bǔ)任何額外的空間。始終被視為唯一值上述兩個(gè)約束的組合。表范圍的約束可以是,,或。如何在中創(chuàng)建表我們將創(chuàng)建一個(gè)名為的表,它定義了各種游樂場(chǎng)設(shè)備。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 本文由angel_郁 發(fā)表于云+社區(qū)專欄 什么是PostgreSQL? PostgreSQL是自由...
閱讀 1135·2021-09-22 15:32
閱讀 1731·2019-08-30 15:53
閱讀 3263·2019-08-30 15:53
閱讀 1418·2019-08-30 15:43
閱讀 461·2019-08-28 18:28
閱讀 2576·2019-08-26 18:18
閱讀 676·2019-08-26 13:58
閱讀 2535·2019-08-26 12:10