国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PostgreSQL之序列(Sequence)

geekzhou / 1071人閱讀

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

相關(guān)文章

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

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

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

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

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

    摘要:移動(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...

    anyway 評(píng)論0 收藏0
  • 想熟悉PostgreSQL?這篇就夠了

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

    DTeam 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<