PostgreSQL SERIAL創建自增列


  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)

  序列生成器不是事務安全的。意味着如果兩個並發數據庫連接嘗試從序列中獲取下一個值,每個客戶端獲得不同的值。如果一個客戶端回滾事務,則該序列值將被棄用,導致序列值不連續。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM