摘要:中的序列是一個數據庫對象,本質上是一個自增器。因此,序列在其他同類型數據庫軟件中以值的形式存在。注意字段的默認值并不是強制使用的。用戶仍然可以手動插入值,這樣潛在地造成與未來的序列值沖突的風險。現在我們成功地執行一次序列刪除來自
PostgreSQL 中的序列是一個數據庫對象,本質上是一個自增器。因此,序列在其他同類型數據庫軟件中以 autoincrment 值的形式存在。在一張表需要非隨機,唯一標實符的場景下,Sequence 非常有用。
Sequence 對象中包含當前值,和一些獨特屬性,例如如何遞增(或者遞減)。實際上,Sequence 是不能被直接訪問到的;他們需要通過 PostgreSQL 中的相關函數來操作他們。
創建序列看看創建的語法:
CREATE SEQUENCE sequencename [ INCREMENT increment ] -- 自增數,默認是 1 [ MINVALUE minvalue ] -- 最小值 [ MAXVALUE maxvalue ] -- 最大值 [ START start ] -- 設置起始值 [ CACHE cache ] -- 是否預先緩存 [ CYCLE ] -- 是否到達最大值的時候,重新返回到最小值
Sequence 使用的是整型數值,因此它的取值范圍是 [-2147483647, 2147483647] 之間;現在我們創建一個簡單的序列:
pigdb> CREATE SEQUENCE shipments_ship_id_seq MINVALUE 0; CREATE SEQUENCE查看序列
psql 的 d 命令輸出一個數據庫對象,包括 Sequence,表,視圖和索引。你還可以使用 ds 命令只查看當前數據庫的所有序列。例如:
pigdb-# ds List of relations Schema | Name | Type | Owner --------+-----------------------+----------+-------- public | author_ids | sequence | ichexw public | shipments_ship_id_seq | sequence | ichexw (2 rows)
Sequence 就像表和視圖一樣,擁有自己的結構,只不過它的結構是固定的:
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
我們現在查詢下 shipments_ship_id_seq 的 last_value(當前的序列值)和 increment_by (當 nextval() 被調用,當前值將會被增加)。
pigdb=# SELECT last_value, increment_by FROM shipments_ship_id_seq; last_value | increment_by ------------+-------------- 0 | 1 (1 row)
由于序列剛剛被創建,因此 last_value 被設置成 0。
使用序列我們需要知道的 Sequence 的函數使用:
nextval("sequence_name"): 將當前值設置成遞增后的值,并返回 currval("sequence_name"): 返回當前值 setval("sequence_name", n, b=true): 設置當前值;b 默認設置 true,下一次調用 nextval() 時,直接返回 n,如果設置 false,則返回 n+increment:
nextval() 函數要求一個序列名(必須由單引號包圍)為第一個參數。 需要注意的是,當你第一次調用 nextval() 將會返回序列的初始值,即 START;因為他沒有調用遞增的方法。
pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 0 (1 row) pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 1 (1 row)
Sequence 一般作為表的唯一標識符字段的默認值使用(這是序列的最常見的場景);看個例子:
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 字段的默認值將被設置成 shipments_ship_id_seq 的 nextval() 值。如果插入值的時候,沒有指定 id 的值,將會自動選擇 nextval("shipments_ship_id_seq") 的值。
注意: id 字段的默認值并不是強制使用的。用戶仍然可以手動插入值,這樣潛在地造成與未來的序列值沖突的風險。這個可以通過 trigger 來防止這個問題,后續將詳細介紹。
為了防止同一個序列同時被多個被多個用戶訪問導致錯誤,序列的當前值與 session 關聯。兩個用戶可能在兩個不同的會話訪問同一個序列,但是調用 currval() 時,只會返回同一會話下的當前值。
現在看看 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 設置成任意值(必須在序列的取值范圍內)。這個要求一個序列名(必須由單引號包圍著)作為第一個參數,以及要設置的最后值作為第二個參數;看幾個例子:
pigdb=# SELECT setval("shipments_ship_id_seq", 1010); setval -------- 1010 (1 row) pigdb=# SELECT nextval("shipments_ship_id_seq"); nextval --------- 1011 (1 row)
前文中,我們還提到了 setval() 的第三個參數;現在把它設置成 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)
當第三個參數設置成 false 的時候,就像重新創建序列時,第一次調用的時候,只是初始化 last_val,不會調用遞增函數。
刪除序列
你可以使用:
DROP SEQUENCE seq_name[, ...]
來刪除一個或者多個序列。命令中的 seq_name 是序列名,不須被引號包圍;如果是多個序列,可以使用逗號隔開。
現在我們試一下這個命令:
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。
我們可以使用下面的語句來查看的序列是否被數據庫中的其他對象引用,:
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 引用。你可以把這個序列名替換成任何一個你像查看的序列;或者不添加任何條件查看當前數據庫中所有序列的引用。
現在我們成功地執行一次序列刪除:
pigdb=# DROP TABLE shipments; DROP TABLE pigdb=# DROP SEQUENCE shipments_ship_id_seq; DROP SEQUENCE
來自:http://n3xtchen.github.io
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38924.html
摘要:數據類型類型轉換數值類型數值類型序列類型不同于的自增長,和都是序列的方式創建使用創建序列關聯列表架構模式名稱類型擁有者數據表數據表序列數行記錄數據 數據類型 showImg(https://segmentfault.com/img/bVbi9mw?w=750&h=379);showImg(https://segmentfault.com/img/bVbi9mz?w=729&h=626)...
摘要:直接切換到對應的庫下執行注意,這個不能獲取到和的歸屬情況,只能獲取到表和序列的的情況上面的這個,能查出下面的這種歸屬的對于下面的這種情況,都查不出來的。表的是一個,表里面又有其它的授權非的下 直接切換到對應的庫下執行select nsp.nspname as SchemaName ,cls.relname a...
摘要:移動易后臺實現外部數據庫連接要實現外置數據庫,即上層開發人員不關心下層數據庫的實現,在項目中需要針對不同數據庫修改文件以及在項目中添加依賴包。本文主要介紹移動易后臺如何實現同不同數據源的連接,數據源包括,。 1、移動易后臺實現外部數據庫連接 要實現外置數據庫,即上層開發人員不關心下層數據庫的實現,在Spring boot項目 中需要針對不同數據庫修改application.proper...
摘要:它在其他開放源代碼數據庫系統和專有系統之外,為用戶又提供了一種選擇。將插入空間以填補任何額外的空間。始終被視為唯一值上述兩個約束的組合。表范圍的約束可以是,,或。如何在中創建表我們將創建一個名為的表,它定義了各種游樂場設備。 歡迎大家前往騰訊云+社區,獲取更多騰訊海量技術實踐干貨哦~ 本文由angel_郁 發表于云+社區專欄 什么是PostgreSQL? PostgreSQL是自由...
閱讀 1122·2021-09-22 15:32
閱讀 1722·2019-08-30 15:53
閱讀 3253·2019-08-30 15:53
閱讀 1404·2019-08-30 15:43
閱讀 453·2019-08-28 18:28
閱讀 2567·2019-08-26 18:18
閱讀 669·2019-08-26 13:58
閱讀 2528·2019-08-26 12:10