PostgreSQL SERIAL創建自增列
本文我們介紹PostgreSQL SERIAL,並展示如何使用serial類型創建表自增列。
PostgreSQL SERIAL偽類型
PostgreSQL序列是一種特殊的用於生產整數序列數據庫對象。序列通常用於主鍵列,與mysql的AUTO_INCREMENT 概念類似。創建表時使用serial偽類型定義序列:
CREATE TABLE table_name(
id SERIAL
);
賦值serial偽類型給id列,PostgreSQL將執行下列步驟:
創建序列對象並設置下一個生成值作為列的缺省值。
給對應列增加NOT NULL約束,因為序列總是生成一個整數值,不能為null值。
賦值序列的擁有者給id列,因此當id列或表被刪除時,序列對象自動被刪除。
對應背后執行語句:
CREATE TABLE table_name(
id SERIAL
);
相當於執行了下面語句:
CREATE SEQUENCE table_name_id_seq;
CREATE TABLE table_name (
id integer NOT NULL DEFAULT nextval('table_name_id_seq')
);
ALTER SEQUENCE table_name_id_seq
OWNED BY table_name.id;
PostgreSQL 提供三種序列偽類型,分別為SMALLSERIAL, SERIAL, BIGSERIAL,對應范圍如下:
Name Storage Size Range
SMALLSERIAL 2 bytes 1 to 32,767
SERIAL 4 bytes 1 to 2,147,483,647
BIGSERIAL 8 bytes 1 to 922,337,2036,854,775,807
PostgresQL SERIAL示例
特別需要注意的是,serial列不會隱式在列上創建索引或是該列為主鍵列。當然可以很容易使用PRIMARY KEY關鍵字增加相應約束。
下面語句創建fruits表,其中id類是serial類型:
CREATE TABLE fruits(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
);
在insert語句中,可以忽略對應列或使用default關鍵字都可以給serial賦值,請看示例:
INSERT INTO fruits(name) VALUES('orange');
或者: 無錫人流醫院 http://www.bhnfkyy.com/
INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');
PostgreSQL 給fruits表中插入兩行記錄,id的值為1和2:
SELECT *
FROM fruits;
id | name
----+--------
1 | apple
2 | orange
(2 rows)
使用pg_get_serial_sequence函數可以獲得serial列的序列名稱:
pg_get_serial_sequence('table_name','column_name')
通過給currval函數傳入序列名稱可以獲得當前生成的值。舉例,下面語句返回最近生成的值:
SELECT currval(pg_get_serial_sequence('fruits', 'id'));
返回結果:
currval
---------
2
(1 row)
當執行insert語句是,你想獲得序列生成的值,可以在insert語句中使用RETURNING id子句實現。下面語句插入一行新的記錄,並返回id列生成的值:
INSERT INTO fruits(name) VALUES('banana')
RETURNING id;
結果如下:
id
----
3
(1 row)
序列生成器不是事務安全的。意味着如果兩個並發數據庫連接嘗試從序列中獲取下一個值,每個客戶端獲得不同的值。如果一個客戶端回滾事務,則該序列值將被棄用,導致序列值不連續。