日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

AliSQL提供了Sequence Engine,簡化獲取序列值的復(fù)雜度。

Sequence Engine介紹

在持久化數(shù)據(jù)庫系統(tǒng)中,無論是單節(jié)點(diǎn)中的業(yè)務(wù)主鍵,還是分布式系統(tǒng)中的全局唯一值,亦或是多系統(tǒng)中的冪等控制,單調(diào)遞增的唯一值是常見的需求。不同的數(shù)據(jù)庫系統(tǒng)有不同的實(shí)現(xiàn)方法,例如MySQL提供的AUTO_INCREMENT,Oracle、SQL Server提供的SEQUENCE。

在MySQL數(shù)據(jù)庫中,如果業(yè)務(wù)希望封裝唯一值,例如增加日期、用戶等信息,使用AUTO_INCREMENT的方法會(huì)帶來很大不便,在實(shí)際的系統(tǒng)設(shè)計(jì)中,也存在不同的折中方法:

  • 序列值由Application或者Proxy來生成,不過弊端很明顯,狀態(tài)帶到應(yīng)用端會(huì)增加擴(kuò)容和縮容的復(fù)雜度。

  • 序列值由數(shù)據(jù)庫通過模擬的表來生成,但需要中間件來封裝和簡化獲取唯一值的邏輯。

AliSQL提供了Sequence Engine,通過引擎的設(shè)計(jì)方法,盡可能地兼容其他數(shù)據(jù)庫的使用方法,簡化獲取序列值復(fù)雜度。

Sequence Engine實(shí)現(xiàn)了MySQL存儲(chǔ)引擎的設(shè)計(jì)接口,但底層的數(shù)據(jù)仍然使用現(xiàn)有的存儲(chǔ)引擎,例如InnoDB或者M(jìn)yISAM來保存持久化數(shù)據(jù),兼容現(xiàn)有的第三方工具(例如Xtrabackup),所以Sequence Engine僅僅是一個(gè)邏輯引擎。

Sequence Engine通過Sequence Handler接口訪問Sequence對象,實(shí)現(xiàn)NEXTVAL的滾動(dòng)、緩存的管理等,最后透傳給底層的基表數(shù)據(jù)引擎,實(shí)現(xiàn)最終的數(shù)據(jù)訪問。

前提條件

實(shí)例版本如下:

  • RDS MySQL 8.0(內(nèi)核小版本為20190816及以上)

  • RDS MySQL 5.7(內(nèi)核小版本為20210430及以上)

  • RDS MySQL 5.6(內(nèi)核小版本為20170901及以上)

使用限制

  • Sequence不支持子查詢和join查詢。

  • 可以使用SHOW CREATE TABLE來訪問Sequence結(jié)構(gòu)。

  • 不支持建表的時(shí)候指定Sequence引擎,Sequence表只能通過創(chuàng)建Sequence的語法來創(chuàng)建。

創(chuàng)建Sequence

創(chuàng)建Sequence語句如下:

CREATE SEQUENCE [IF NOT EXISTS] <數(shù)據(jù)庫名>.<Sequence名稱>
   [START WITH <constant>]
   [MINVALUE <constant>]
   [MAXVALUE <constant>]
   [INCREMENT BY <constant>]
   [CACHE <constant> | NOCACHE]
   [CYCLE | NOCYCLE]
  ;
說明

方括號(hào)([])中的內(nèi)容非必填。

參數(shù)說明如下。

參數(shù)

說明

START WITH

Sequence的起始值。

MINVALUE

Sequence的最小值。

MAXVALUE

Sequence的最大值。

說明

如果有參數(shù)NOCYCLE,到達(dá)最大值后會(huì)報(bào)如下錯(cuò)誤:

ERROR HY000: Sequence 'db.seq' has been run out.

INCREMENT BY

Sequence的步長。

CACHE/NOCACHE

緩存的大小,為了性能考慮,可以設(shè)置較大的緩存,但如果遇到實(shí)例重啟,緩存內(nèi)的值會(huì)丟失。

CYCLE/NOCYCLE

表示Sequence如果用完了后,是否允許從MINVALUE重新開始。取值:

  • CYCLE:允許;

  • NOCYCLE:不允許。

示例:

create sequence s
       start with 1
       minvalue 1
       maxvalue 9999999
       increment by 1
       cache 20
       cycle;

為了兼容MySQL Dump的備份方式,您也可以使用另外一種創(chuàng)建Sequence的方法,即創(chuàng)建Sequence表并插入一行初始記錄。示例如下:

CREATE TABLE schema.sequence_name (  `currval` bigint(21) NOT NULL COMMENT 'current value',
  `nextval` bigint(21) NOT NULL COMMENT 'next value',
  `minvalue` bigint(21) NOT NULL COMMENT 'min value',
  `maxvalue` bigint(21) NOT NULL COMMENT 'max value',
  `start` bigint(21) NOT NULL COMMENT 'start value',
  `increment` bigint(21) NOT NULL COMMENT 'increment value',
  `cache` bigint(21) NOT NULL COMMENT 'cache size',
  `cycle` bigint(21) NOT NULL COMMENT 'cycle state',
  `round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1;

INSERT INTO schema.sequence_name VALUES(0,0,1,9223372036854775807,1,1,10000,1,0);
COMMIT;

Sequence表介紹

由于Sequence是通過真正的引擎表來保存的,所以通過查詢創(chuàng)建語句看到仍然是默認(rèn)的引擎表。示例如下:

SHOW CREATE TABLE schema.sequence_name;

CREATE TABLE schema.sequence_name (
  `currval` bigint(21) NOT NULL COMMENT 'current value',
  `nextval` bigint(21) NOT NULL COMMENT 'next value',
  `minvalue` bigint(21) NOT NULL COMMENT 'min value',
  `maxvalue` bigint(21) NOT NULL COMMENT 'max value',
  `start` bigint(21) NOT NULL COMMENT 'start value',
  `increment` bigint(21) NOT NULL COMMENT 'increment value',
  `cache` bigint(21) NOT NULL COMMENT 'cache size',
  `cycle` bigint(21) NOT NULL COMMENT 'cycle state',
  `round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1

查詢語法

Sequence支持的查詢語法如下:

  • SELECT nextval(<Sequence名稱>),currval(<Sequence名稱>) FROM <Sequence名稱>;

    說明

    適用于MySQL 8.0、MySQL 5.7。

  • SELECT <Sequence名稱>.currval, <Sequence名稱>.nextval FROM dual;

    說明

    適用于MySQL 8.0、MySQL 5.7、MySQL 5.6。

示例:

mysql> SELECT test.currval, test.nextval from dual;
+--------------+--------------+
| test.currval | test.nextval |
+--------------+--------------+
|           24 |           25 |
+--------------+--------------+
1 row in set (0.03 sec)
            
說明

新創(chuàng)建的Sequence需要先調(diào)用一次該Sequence的NEXTVAL才能正常進(jìn)行查詢,否則會(huì)報(bào)Sequence 'xxx' is not yet defined in current session錯(cuò)誤。

NEXTVAL調(diào)用示例:

SELECT <Sequence名稱>.nextval FROM dual;