.\" auto-generated by docbook2man-spec $Revision: 1.1 $ .TH "CREATE SEQUENCE" "7" "2003-11-02" "SQL - Language Statements" "SQL Commands" .SH NAME CREATE SEQUENCE \- 創建一個新的序列發生器 .SH SYNOPSIS .sp .nf CREATE [ TEMPORARY | TEMP ] SEQUENCE \fIname\fR [ INCREMENT [ BY ] \fIincrement\fR ] [ MINVALUE \fIminvalue\fR | NO MINVALUE ] [ MAXVALUE \fImaxvalue\fR | NO MAXVALUE ] [ START [ WITH ] \fIstart\fR ] [ CACHE \fIcache\fR ] [ [ NO ] CYCLE ] .sp .fi .SH "DESCRIPTION 描述" .PP \fBCREATE SEQUENCE\fR 將向當前數據庫裏增加一個新的序列號生成器。 包括創建和初始化一個新的名爲 name的單行表。生成器將爲使用此命令的用戶所有。 .PP 如果給出了一個模式名,那麼該序列是在指定模式中創建的。 否則它會在當前模式中創建臨時序列存在於一個特殊的模式中,因此如果創建一個臨時序列的時候, 不能給出模式名。 序列名必需和同一模式中的其他序列,表,索引,或者視圖不同。 .PP 在序列創建後,你可以使用函數 \fBnextval\fR, \fBcurrval\fR, 和 \fBsetval\fR 操作序列。這些函數在 ``Sequence-Manipulation Functions'' 中有詳細文檔。 .PP 儘管你不能直接更新一個序列,但你可以使用象 .sp .nf SELECT * FROM \fIname\fR; .sp .fi 檢查一個序列的參數和當前狀態。特別是序列的 last_value 字段顯示了任意後端進程分配的最後的數值。 (當然,這些值在被打印出來的時候可能已經過時了 --- 如果其它進程正積極地使用 nextval。) .SH "PARAMETERS 參數" .TP \fBTEMPORARY or TEMP\fR 如果聲明瞭這個修飾詞,那麼該序列對象只爲這個會話創建, 並且在會話結束的時候自動刪除。在臨時序列存在的時候, 同名永久序列是不可見的(在同一會話裏),除非它們是用模式修飾的名字引用的。 .TP \fB\fIname\fB\fR 將要創建的序列號名(可以用模式修飾)。 .TP \fB\fIincrement\fB\fR INCREMENT BY \fIincrement\fR 子句是可選的。一個正數將生成一個遞增的序列, 一個負數將生成一個遞減的序列。缺省值是一(1)。 .TP \fB\fIminvalue\fB\fR .TP \fBNO MINVALUE\fR 可選的子句 MINVALUE minvalue 決定一個序列可生成的最小值。 如果沒有聲明這個子句或者聲明瞭 NO MINVALUE,那麼就使用缺省。 缺省分別是遞增序列爲 1 遞減爲 -263-1。 .TP \fB\fImaxvalue\fB\fR .TP \fBNO MAXVALUE\fR 使用可選子句 MAXVALUE maxvalue 決定序列的最大值。 如果沒有聲明這個子句或者聲明瞭 NO MAXVALUE,那麼就使用缺省。 缺省的分別是遞增爲 263-1,遞減爲 -1。 .TP \fB\fIstart\fB\fR 可選的 START WITH start 子句 使序列可以從任意位置開始。缺省初始值是遞增序列爲 minvalue 遞減序列爲 maxvalue. .TP \fB\fIcache\fB\fR CACHE cache 選項使序列號預分配並且爲快速訪問存儲在內存裏面。 最小值(也是缺省值)是1(一次只能生成一個值, 也就是說沒有緩存)這也是缺省。 .TP \fBCYCLE\fR .TP \fBNO CYCLE\fR 可選的CYCLE關鍵字可用於使序列到達 最大值(maxvalue) 或 最小值(minvalue) 時可復位並繼續下去。如果達到極限,生成的下一個數據將分別是 最小值(minvalue) 或 最大值(maxvalue)。 如果聲明瞭可選的關鍵字 NO CYCLE, 那麼在序列達到其最大值之後任何對 nextval 的調用都強返回一個錯誤。 如果既沒有聲明 CYCLE 也沒有聲明 NO CYCLE, 那麼 NO CYCLE 是缺省。 .SH "NOTES 注意" .PP 使用 DROP SEQUENCE 語句來刪除序列。 .PP 序列是基於 \fBbigint\fR 運算的,因此其範圍不能超過八字節的整數範圍(-9223372036854775808 到 9223372036854775807)。 在一些老一點的平臺上可能沒有對八字節整數的編譯器支持, 這種情況下序列使用普通的 integer 運算(範圍是 -2147483648 到 +2147483647)。 .PP 如果 cache 設置大於一, 並且這個序列對象將被用於併發多會話的場合,那麼可能會有不可預料的結果發生。 每個會話在一次訪問序列對象的過程中將分配並緩存隨後的序列值,並且相應增加序列對象的 last_value。 這樣,同一個事務中的隨後的 cache-1 次 nextval 將只是返回預先分配的數值,而不用動序列對象。因此,任何在一個會話中分配但是沒有使用的數字都將在會話結尾丟失,導致序列裏面出現"空洞"。 .PP 另外,儘管系統保證爲多個會話分配獨立的序列值,但是如果考慮所有會話, 那麼這個數值可能會丟失順序。比如,如果 cache 設置爲 10,那麼會話 A 保留了 1..10 並且返回 nextval=1, 然後會話 B 可能會保留 11..20 然後在會話 A 生成 nextval=2 之前返回 nextval=11。因此,對於 cache 設置爲一的情況,我們可以安全地假設 nextval 值是順序生成的; 而如果把 cache 設置得大於一, 那麼你只能假設 nextval 值總是唯一得,而不是完全順序地生成。 同樣,last_value 將反映任何會話保留的最後的數值,不管它是否曾被 nextval 返回。 .PP 另外一個考慮是在這樣的序列上執行的 setval 將不會被其它會話注意到,直到它們用光他們緩存的數值。 .SH "EXAMPLES 例子" .PP 創建一個叫 serial 的遞增序列,從101開始: .sp .nf CREATE SEQUENCE serial START 101; .sp .fi .PP 從此序列中選出下一個數字: .sp .nf SELECT nextval('serial'); nextval --------- 114 .sp .fi .PP 在一個 INSERT 中使用此序列: .sp .nf INSERT INTO distributors VALUES (nextval('serial'), 'nothing'); .sp .fi .PP 在一個 COPY FROM 後更新序列: .sp .nf BEGIN; COPY distributors FROM 'input_file'; SELECT setval('serial', max(id)) FROM distributors; END; .sp .fi .SH "COMPATIBILITY 兼容性" .PP \fBCREATE SEQUENCE\fR 是 PostgreSQL 語言擴展。 在 SQL 標準裏沒有 CREATE SEQUENCE 語句。 .SH "譯者" .B Postgresql 中文網站 .B 何偉平 .SH "跋" .br 本頁面中文版由中文 man 手冊頁計劃提供。 .br 中文 man 手冊頁計劃:\fBhttps://github.com/man-pages-zh/manpages-zh\fR