成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PostgreSQL之序列(Sequence)

geekzhou / 1146人閱讀

摘要:中的序列是一個數(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

相關(guān)文章

  • PostgreSQL的實踐一:數(shù)據(jù)類型(一)

    摘要:數(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)...

    高璐 評論0 收藏0
  • PostgreSQL獲取用戶下所有對象的權(quán)限情況

    摘要:直接切換到對應(yīng)的庫下執(zhí)行注意,這個不能獲取到和的歸屬情況,只能獲取到表和序列的的情況上面的這個,能查出下面的這種歸屬的對于下面的這種情況,都查不出來的。表的是一個,表里面又有其它的授權(quán)非的下 直接切換到對應(yīng)的庫下執(zhí)行select nsp.nspname as SchemaName ,cls.relname a...

    番茄西紅柿 評論0 收藏2637
  • 移動易開源APP組合套件更新——支持多種外部數(shù)據(jù)庫,支持全文搜索

    摘要:移動易后臺實現(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...

    anyway 評論0 收藏0
  • 想熟悉PostgreSQL?這篇就夠了

    摘要:它在其他開放源代碼數(shù)據(jù)庫系統(tǒng)和專有系統(tǒng)之外,為用戶又提供了一種選擇。將插入空間以填補任何額外的空間。始終被視為唯一值上述兩個約束的組合。表范圍的約束可以是,,或。如何在中創(chuàng)建表我們將創(chuàng)建一個名為的表,它定義了各種游樂場設(shè)備。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實踐干貨哦~ 本文由angel_郁 發(fā)表于云+社區(qū)專欄 什么是PostgreSQL? PostgreSQL是自由...

    DTeam 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<