序列數(shù)可以增加postgresql數(shù)據(jù)表的檢索速度,同時(shí)降低數(shù)據(jù)查詢時(shí)的資源消耗。那么如何在postgresql中創(chuàng)建序列數(shù)并且應(yīng)用呢?下面我給大家分享一下。
十載的庫(kù)車網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整庫(kù)車建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“庫(kù)車網(wǎng)站設(shè)計(jì)”,“庫(kù)車網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
工具/材料
pgAdmin4
創(chuàng)建序列數(shù)
首先打開pgAdmin4,展開postgresql數(shù)據(jù)庫(kù),找到模式下面的public選項(xiàng),如下圖所示
接下來在public下面右鍵單擊序列,然后點(diǎn)擊Create下面的sequence選項(xiàng),如下圖所示
在彈出的創(chuàng)建Sequence界面中首先給序列數(shù)起一個(gè)名字,如下圖所示,注意都用英文
然后切換到Definition頁(yè)卡,定義一下序列的增加量,如下圖所示,其中maximum根據(jù)自己的需要進(jìn)行設(shè)置
最后回到數(shù)據(jù)庫(kù)主界面,你會(huì)看到序列下面多出了一個(gè)項(xiàng),這就是我們創(chuàng)建的序列數(shù)了,如下圖所示
在數(shù)據(jù)表中應(yīng)用序列數(shù)
首先選中一個(gè)數(shù)據(jù)表,點(diǎn)擊右側(cè)的編輯按鈕,如下圖所示
在彈出的編輯界面中切換到Columns頁(yè)卡,點(diǎn)擊ID簽名的編輯按鈕,如下圖所示
最后在字段的編輯界面中切換到Variables選項(xiàng)卡,然后在Value列中通過nextval函數(shù)帶入剛才定義的序列數(shù)即可,如下圖所示
找到運(yùn)行腳本的地方,文本復(fù)制進(jìn)去,點(diǎn)運(yùn)行,數(shù)據(jù)庫(kù)就創(chuàng)建好了。
1為pg_database增加一個(gè)字段 datdummy,打開 /src/include/catalog/pg_database.h:
CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO
{
NameData datname; /* database name */
Oid datdba; /* owner of database */
int32 encoding; /* character encoding */
NameData datcollate; /* LC_COLLATE setting */
NameData datctype; /* LC_CTYPE setting */
bool datistemplate; /* allowed as CREATE DATABASE template? */
bool datallowconn; /* new connections allowed? */
int32 datconnlimit; /* max connections allowed (-1=no limit) */
Oid datlastsysoid; /* highest OID to consider a system OID */
TransactionId datfrozenxid; /* all Xids this are frozen in this DB */
TransactionId datminmxid; /* all multixacts in the DB are = this */
Oid dattablespace; /* default table space for this DB */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
aclitem datacl[1]; /* access permissions */
#endif
} FormData_pg_database;
/* ----------------
* Form_pg_database corresponds to a pointer to a tuple with
* the format of pg_database relation.
* ----------------
*/
typedef FormData_pg_database *Form_pg_database;
/* ----------------
* compiler constants for pg_database
* ----------------
*/
#define Natts_pg_database 13
#define Anum_pg_database_datname 1
#define Anum_pg_database_datdba 2
#define Anum_pg_database_encoding 3
#define Anum_pg_database_datcollate 4
#define Anum_pg_database_datctype 5
#define Anum_pg_database_datistemplate 6
#define Anum_pg_database_datallowconn 7
#define Anum_pg_database_datconnlimit 8
#define Anum_pg_database_datlastsysoid 9
#define Anum_pg_database_datfrozenxid 10
#define Anum_pg_database_datminmxid 11
#define Anum_pg_database_dattablespace 12
#define Anum_pg_database_datacl 13
它們最終會(huì)被腳本 genbki.pl 利用生成 postgresql.bki文件,用在 initdb 初始化 data cluster 時(shí),有興趣可以自己學(xué)習(xí)一下,PG編譯系統(tǒng)也是一個(gè)充分展示強(qiáng)大 perl 語(yǔ)言的系統(tǒng);
3、在 dattablespace 下增加新定義:
int8 datdummy; /* dummy column */
后邊字段序號(hào)的定義也是很重要的,必須按順序修改,也要記得屬性數(shù)相應(yīng)修改:
#define Natts_pg_database 14
...
#define Anum_pg_database_dattablespace 12
#define Anum_pg_database_datdummy 13
#define Anum_pg_database_datacl 14
預(yù)定義的數(shù)據(jù)庫(kù)必須也要修改,_null_ 前邊增加 100的字段為 datdummy 數(shù)據(jù):
DATA(insert OID = 1 ( template1 PGUID ENCODING "LC_COLLATE" "LC_CTYPE" t t -1 0 0 1 1663 100 _null_));
4、編譯運(yùn)行,會(huì)發(fā)生什么,編譯正常,然后 initdb,竟然也神奇的通過了,難道這就好了嗎?
Tip:Linux 下不停在一個(gè)目錄下改代碼,可能會(huì)遇到莫名的程序問題,試試 make clean
5、那么創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)試試看:CREATE DATABASE quanzl; 成功了,是不是感覺似乎還缺點(diǎn)什么?
datdummy的賦值,總不能 UPDATE pg_database SET datdummy = xxx 吧?
預(yù)訂義的數(shù)據(jù)庫(kù)比如template1,我們可以在catalog里邊定義 BKI 腳本,比如上邊的例子,給它一個(gè)初始值。程序里也必須有所改動(dòng)才能成為可操作屬性;
6、參照語(yǔ)法修改,創(chuàng)建一個(gè) CREATE DATABASE xxx DUMMY nnn語(yǔ)法,修改結(jié)構(gòu)體 CreatedbStmt 增加新屬性,語(yǔ)法分析階段將此值讀入,創(chuàng)建數(shù)據(jù)庫(kù)時(shí)將它寫入屬性;
new_record[Anum_pg_database_datdummy - 1] = 1234;
此部分代碼在 src/backend/commands/dbcommands.c 中,自行閱讀好了,寫程序就這么簡(jiǎn)單。:)