SQL 序列生成器

来源:https://www.cnblogs.com/88223100/archive/2022/08/15/SQL-sequence-generator.html
-Advertisement-
Play Games

本篇介紹SQL:2016(ISO/IEC 9075:2016)標準中定義的序列生成器(Sequence generator)和相關操作,以及六種主流資料庫中的實現及差異:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、Db2、SQLite。 ————————... ...


本篇介紹SQL:2016(ISO/IEC 9075:2016)標準中定義的序列生成器(Sequence generator)和相關操作,以及六種主流資料庫中的實現及差異:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、Db2、SQLite。

序列概述

在 SQL 中,序列生成器(簡稱序列)用於自動生成一系列不重覆的數字。序列的數據類型通常是整數,包含一個最小值,一個最大值,一個起始值,一個增量值,以及一個迴圈使用選項。

 

 

 

如果序列的增量是一個正整數,稱為升序序列,例如 1,3,5,7,…(增量為 2);如果序列的增量是一個負整數,稱為降序序列,例如2,1,0,-1,…(增量為 -1)。

由於序列可以生成不重覆的值,因此通常用於主鍵值的生成;由於序列的值具有遞增特性,因此可以用於記錄各個操作發生的先後順序。

序列可以通過兩種方式進行定義:使用CREATE SEQUENCE語句創建一個外部序列;或者通過一個標識列(identity column)或自動增長列(auto increment column)隱式創建一個內部序列。

本文先介紹外部序列相關的操作,包括序列的創建、使用、修改和刪除;最後介紹六種資料庫中實現的標識列或自增列功能。

創建序列

在 SQL 中使用CREATE SEQUENCE創建一個外部序列,標準語法如下:

CREATE SEQUENCE seq_name
  [ AS data_type ]
  [ START WITH s ]
  [ INCREMENT BY i ]
  [ MAXVALUE M | NO MAXVALUE ]
  [ MINVALUE m | NO MINVALUE ]
  [ CYCLE | NO CYCLE ]
;

其中,只有序列名稱 seq_name 是必須的參數;其他可選參數的意義如下:

AS data_type指定序列的數據類型,只能是整數類型;
START WITH s指定序列的初始值,s 是一個數值常量。預設為序列的最小值或者最大值;
INCREMENT BY i指定序列的增量值,i 是一個數值常量,負數表示降序序列。預設值為 1;
MAXVALUE M指定序列允許的最大值;NO MAXVALUE表示不指定最大值,通常由序列的數據類型或者資料庫產品自定義一個最大值;
MINVALUE m指定序列允許的最小值;NO MINVALUE表示不指定最小值,通常由序列的數據類型或者資料庫產品自定義一個最小值;
CYCLE表示當序列的取值到達最大值(最小值)時,是否重新迴圈使用;NO CYCLE表示當序列到達最大值(最小值)時,無法生成新的序列值。預設為NO CYCLE。

MySQL 和 SQLite 目前還不支持創建序列對象。
Oracle 不支持指定序列的數據類型,預設使用 NUMBER 類型。

以下示例使用預設值創建一個名為 seq1 的序列:

-- For Oracle, SQL Server, PostgreSQL and Db2
CREATE SEQUENCE seq1;

對於 Oracle,以上語句創建一個從 1 開始,增量為 1,最小值為 1,最大值為 1028 - 1 的非迴圈序列。

對於 SQL Server,以上語句創建一個從 -263 開始,增量為 1,最小值為 -263,最大值為 263 - 1 的非迴圈序列。

對於 PostgreSQL,以上語句創建一個從 1 開始,增量為 1,最小值為 1,最大值為 263 - 1 的非迴圈序列。

對於 Db2,以上語句創建一個從 1 開始,增量為 1,最小值為 1,最大值為 231 - 1 的非迴圈序列。

以下語句創建一個從 10 開始,增量為 -2(降序),最小值為 0,最大值為 100 的迴圈序列。

-- For Oracle, SQL Server, PostgreSQL and Db2
CREATE SEQUENCE seq2
 START WITH 10
 INCREMENT BY -2
 MAXVALUE 100
 MINVALUE 0
 CYCLE;

序列 seq2 的取值依次為 10,8,6,…,0,100,98,… ;序列取值到達最小值(0)之後,再次從最大值開始(100)。

不同的資料庫產品針對 SQL 標準進行了一些專有的擴展,以下是常見的擴展選項。

 

CACHE

Oracle、SQL Server、PostgreSQL 以及 Db2 都支持序列的緩存選項,例如:

-- For Oracle, SQL Server, PostgreSQL and Db2
CREATE SEQUENCE seq2
 START WITH 10
 INCREMENT BY -2
 MAXVALUE 100
 MINVALUE 0
 CYCLE
 CACHE 20;

使用 CACHE 選項可以減少獲取序列值的磁碟操作,可以提高序列生成的性能。不過,此時服務崩潰(如電源故障)可能導致緩存中保留的序列號丟失。

使用序列

在 SQL 標準中,獲取序列下一個值的語法如下:

NEXT VALUE FOR seq_name
SQL Server 和 Db2 遵循 SQL 標準;
Oracle 使用偽列 seq_name.NEXTVAL 獲取下一個序列值;
PostgreSQL 使用函數 nextval(‘seq_name’) 獲取下一個序列。

 舉例說明,以下查詢使用序列 seq2 返回一系列數值。

-- For SQL Server and Db2
SELECT NEXT VALUE FOR seq2 AS Seq,
       employee_id,
       first_name,
       last_name
  FROM employees;
-- For Oracle only
SELECT seq2.NEXTVAL AS Seq,
       employee_id,
       first_name,
       last_name
  FROM employees;
-- For PostgreSQL only
SELECT nextval('seq2') AS Seq,
       employee_id,
       first_name,
       last_name
  FROM employees;

查詢結果如下:

 

 

 

 

對於查詢結果中的每一行,即使存在同一個序列的多次調用,也只生成一次新值。例如

-- For SQL Server and Db2
SELECT NEXT VALUE FOR seq2 AS Seq, -- seq2.NEXTVAL for Oracle
       NEXT VALUE FOR seq2 AS Seq_2, -- nextval('seq2') for PostgreSQL
       employee_id,
       first_name,
       last_name
  FROM employees;

查詢結果中的每一行,欄位 Seq 和 Seq_2 都返回了相同的值:

 

 

 

同樣可以在 INSERT 語句中使用序列的值,以下示例使用序列 seq2 為表 test_seq 生成主鍵值:

CREATE TABLE test_seq
    ( id   INTEGER NOT NULL PRIMARY KEY
    , name CHARACTER VARYING(20)
    ) ;
-- For SQL Server and Db2
INSERT INTO test_seq(id, name)
VALUES (NEXT VALUE FOR seq2, 'sql'); -- seq2.NEXTVAL for Oracle
INSERT INTO test_seq(id, name)
VALUES (NEXT VALUE FOR seq2, 'java'); -- nextval('seq2') for PostgreSQL
INSERT INTO test_seq(id, name)
VALUES (NEXT VALUE FOR seq2, 'c++');

SELECT id, name
  FROM test_seq;
id  |name |
----|-----|
96  |c++  |
98  |java |
100 |sql  |

此外,插入到表中的序列值有可能是存在間斷,例如在事務中生成了序列值,然後事務被回滾,已經使用的序列值將會被丟棄。如果使用了擴展的 CACHE 選項,當伺服器故障時可能會丟失掉已經緩存的序列值。

相關內容
關於資料庫自增欄位的 3 種實現方式,可以參考這篇文章

參考資料:

Oracle 官方文檔
SQL Server 官方文檔
PostgreSQL 官方文檔
Db2 官方文檔


本文作者:「不剪髮的Tony老師」

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/SQL-sequence-generator.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下說明在 Ubuntu 下如何配置 HC32L110 的燒錄環境, 當前使用的是 JLink. 可以使用 JFlashExe 通過界面進行操作, 也可以通過 JLinkExe 命令行進行操作 ...
  • podman的部署和應用 podman官方網站(https://podman.io/) 什麼是podman Podman是一個無守護進程的容器引擎,用於在Linux系統上開發、管理和運行OCI容器。容器可以作為根運行,也可以以無根模式運行。簡單地說:別名docker=podman 它是一款集合了命令 ...
  • Charles:讓天底下沒有難抓的包。 前言 今天給大家推薦一個我所使用過的抓包工具中最好用的抓包工具-Charles(音譯:查爾斯),它可以抓各端發起的網路請求,我主要用來抓移動設備上的請求,上次小明就通過這種方式找到了一款付費App課程的漏洞,咳咳,不展開說了,畢竟web端的瀏覽器網路請求,打開 ...
  • office 2021 for Mac商業預覽Mac版office 2021 包括Word,Excel,PowerPoint,Outlook,OneDrive,最新版本的office將附帶新的深色模式支持,輔助功能改進,對Word、Excel、PowerPoint、Outlook的性能改進對exce ...
  • Podman部署及應用 什麼是podman Podman是一個開源項目,可在大多數Linux平臺上使用並開源在GitHub上。Podman是一個無守護進程的容器引擎,用於在Linux系統上開發,管理和運行Open Container Initiative(OCI)容器和容器鏡像。Podman提供了一 ...
  • 今天有個小伙伴問我,什麼是謂詞下推,然後我就開啟巴拉巴拉模式,說了好長一段時間,結果發現他還是懵的。 最後我概述給他一句話:所謂謂詞下推,就是將儘可能多的判斷更貼近數據源,以使查詢時能跳過無關的數據。用在SQL優化上來說,就是先過濾再做聚合等操作。 看到這裡的朋友可能就已經明白了什麼是謂詞下推,如果 ...
  • 背景介紹 StoneDB 是一款相容 MySQL 的開源 HTAP 資料庫。StoneDB 的整體架構分為三層,分別是應用層、服務層和存儲引擎層。應用層主要負責客戶端的連接管理和許可權驗證;服務層提供了 SQL 介面、查詢緩存、解析器、優化器、執行器等組件;Tianmu 引擎所在的存儲引擎層是 Sto ...
  • Mysql資料庫 資料庫 資料庫【按照數據結構來組織、存儲和管理數據的倉庫】。是一個長期存儲在電腦內的、有組織的、可共用的、統一管理的大量數據的集合。 數據對於公司來說最寶貴的財富,程式員的工作就是對數據進行管理,包括運算、流轉、存儲、展示等,資料庫最重要的功能就是【存儲數據】,長期保存數據。 M ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...