全部產品
Search
文件中心

PolarDB:隱式用法

更新時間:Jul 06, 2024

本文介紹了Sequence的隱式用法。

建立Sequence

在為拆分表或廣播表的主鍵定義AUTO_INCREMENT後,Sequence可以用於自動填滿主鍵,由PolarDB-X 1.0自動維護。

擴充標準建表文法,增加了自增列的Sequence類型,如果未指定類型關鍵字,則預設類型為GROUP。PolarDB-X 1.0自動建立的、跟表相關聯的Sequence名稱,都是以AUTO_SEQ_為首碼,後面加上表名。

建立Group Sequence、Time-based Sequence或Simple Sequence
文法
CREATE TABLE <name> (
   <column> ... AUTO_INCREMENT [ BY GROUP | SIMPLE | TIME ],
   <column definition>,
   ...
) ... AUTO_INCREMENT=<start value>
說明 如果指定了BY TIME,即Time-based Sequence,則該列類型必須為BIGINT。
建立單元化Group Sequence

文法

CREATE TABLE <name> (
   <column> ... AUTO_INCREMENT [ BY GROUP ] [ UNIT COUNT <numeric value> INDEX <numeric value> ],
   <column definition>,
   ...
) ... AUTO_INCREMENT=<start value>
樣本
  • 樣本一:預設建立一張使用Group Sequence作為自增列的表。
    mysql> CREATE TABLE tab1 (
    col1 BIGINT NOT NULL AUTO_INCREMENT,
    col2 VARCHAR(16),
    PRIMARY KEY(col1)
    ) DBPARTITION BY HASH(col1);
  • 樣本二:建立3張同名的、使用相同單元數量和不同單元索引的單元化Group Sequence作為自增列的表,分別用於3個不同的執行個體或庫。
    1. 執行個體1/庫1

      請在命令列輸入如下代碼:

      mysql> CREATE TABLE tab2 (
      col1 BIGINT NOT NULL AUTO_INCREMENT UNIT COUNT 3 INDEX 0,
      col2 VARCHAR(16),
      PRIMARY KEY(col1)
      ) DBPARTITION BY HASH(col1);
    2. 執行個體2/庫2

      請在命令列輸入如下代碼:

      mysql> CREATE TABLE tab2 (
      col1 BIGINT NOT NULL AUTO_INCREMENT UNIT COUNT 3 INDEX 1,
      col2 VARCHAR(16),
      PRIMARY KEY(col1)
      ) DBPARTITION BY HASH(col1);
    3. 執行個體3/庫3

      請在命令列輸入如下代碼:

      mysql> CREATE TABLE tab2 (
      col1 BIGINT NOT NULL AUTO_INCREMENT UNIT COUNT 3 INDEX 2,
      col2 VARCHAR(16),
      PRIMARY KEY(col1)
      ) DBPARTITION BY HASH(col1);
  • 樣本三:建立一張使用Time-based Sequence作為自增列的表。
    mysql> CREATE TABLE tab3 (
    col1 BIGINT NOT NULL AUTO_INCREMENT BY TIME, 
    col2 VARCHAR(16), 
    PRIMARY KEY(col1)
    ) DBPARTITION BY HASH(col1);
  • 樣本四:建立一張使用Simple Sequence作為自增列的表。
    mysql> CREATE TABLE tab4 ( 
    col1 BIGINT NOT NULL AUTO_INCREMENT BY SIMPLE, 
    col2 VARCHAR(16), 
    PRIMARY KEY(col1)
    ) DBPARTITION BY HASH(col1);

修改Sequence

暫不支援通過ALTER TABLE來修改對應Sequence的類型,但您可以參見如下文法通過ALTER TABLE修改起始值:

ALTER TABLE <name> ... AUTO_INCREMENT=<start value>
說明
  • 如果想要修改表相關的Sequence類型,需要通過SHOW SEQUENCES指令尋找出Sequence的具體名稱和類型,然後再用ALTER SEQUENCE指令去修改。
  • 使用Sequence後,請謹慎修改AUTO_INCREMENT的起始值(仔細評估已經產生的Sequence值,以及產生新Sequence值的速度,防止產生衝突)。

查看錶資訊及相關Sequence類型

SHOW CREATE TABLE

當表為拆分表或者廣播表時,顯示自增列Sequence的類型。

查看已建立的表文法如下:

SHOW CREATE TABLE <name>
說明
  • SHOW CREATE TABLE僅顯示相關Sequence的類型,並不顯示Sequence詳細資料,如需查看,請使用SHOW SEQUENCES命令。
  • 關聯了單元化Group Sequence的表並不顯示單元數量和單元索引,因此不能將SHOW CREATE TABLE顯示的DDL直接用於建立具備同樣單元化Group Sequence能力的表。
  • 如果需要建立具備同樣單元化能力的表,必須使用SHOW SEQUENCES查看單元數量和單元索引,然後參照CREATE TABLE的文法修改通過SHOW CREATE TABLE擷取的建表DDL。
樣本
  • 樣本一:建表時指定AUTO_INCREMENT,但沒有指定Sequence類型關鍵字,則預設使用Group Sequence
    mysql> SHOW CREATE TABLE tab1;

    返回結果如下:

    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                           |
    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | tab1  | CREATE TABLE `tab1` (
    `col1` bigint(20) NOT NULL AUTO_INCREMENT BY GROUP,
    `col2` varchar(16) DEFAULT NULL,
    PRIMARY KEY (`col1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`col1`) |
    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.02 sec)
  • 樣本二:建表時為AUTO_INCREMENT指定了單元數量和單元索引,使用單元化 Group Sequence,但SHOW CREATE TABLE時並不顯示單元數量和單元索引,不能將此DDL用於建立具備同樣單元化 Group Sequence能力的表。
    mysql> SHOW CREATE TABLE tab2;

    返回結果如下:

    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                           |
    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | tab2  | CREATE TABLE `tab2` (
    `col1` bigint(20) NOT NULL AUTO_INCREMENT BY GROUP,
    `col2` varchar(16) DEFAULT NULL,
    PRIMARY KEY (`col1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`col1`) |
    +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)
  • 樣本三:建表時為AUTO_INCREMENT指定了BY TIME,即Time-based Sequence類型。
    mysql> SHOW CREATE TABLE tab3;

    返回結果如下:

    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                            |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | tab3  | CREATE TABLE `tab3` (
    `col1` bigint(20) NOT NULL AUTO_INCREMENT BY TIME,
    `col2` varchar(16) DEFAULT NULL,
    PRIMARY KEY (`col1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`col1`) |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)
  • 樣本四:建表時為AUTO_INCREMENT指定了BY SIMPLE,即Simple Sequence類型。
    mysql> SHOW CREATE TABLE tab4;

    返回結果如下:

    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                            |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | tab3  | CREATE TABLE `tab4` (
    `col1` bigint(20) NOT NULL AUTO_INCREMENT BY TIME,
    `col2` varchar(16) DEFAULT NULL,
    PRIMARY KEY (`col1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`col1`) |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)
SHOW SEQUENCES

建表後相關的Sequence名稱和詳細資料,可通過SHOW SEQUENCES查看。

mysql> SHOW SEQUENCES;

返回結果如下:

+---------------+--------+------------+------------+------------+--------------+------------+---------------------+-------+--------+
| NAME          | VALUE  | UNIT_COUNT | UNIT_INDEX | INNER_STEP | INCREMENT_BY | START_WITH | MAX_VALUE           | CYCLE | TYPE   |
+---------------+--------+------------+------------+------------+--------------+------------+---------------------+-------+--------+
| seq1          | 100000 | 1          | 0          | 100000     | N/A          | N/A        | N/A                 | N/A   | GROUP  |
| seq2          | 400000 | 3          | 1          | 100000     | N/A          | N/A        | N/A                 | N/A   | GROUP  |
| seq3          | N/A    | N/A        | N/A        | N/A        | N/A          | N/A        | N/A                 | N/A   | TIME   |
| seq4          | 1006   | N/A        | N/A        | N/A        | 2            | 1000       | 99999999999         | N     | SIMPLE |
| AUTO_SEQ_tab1 | 100000 | 1          | 0          | 100000     | N/A          | N/A        | N/A                 | N/A   | GROUP  |
| AUTO_SEQ_tab2 | 400000 | 3          | 1          | 100000     | N/A          | N/A        | N/A                 | N/A   | GROUP  |
| AUTO_SEQ_tab3 | N/A    | N/A        | N/A        | N/A        | N/A          | N/A        | N/A                 | N/A   | TIME   |
| AUTO_SEQ_tab4 | 2      | N/A        | N/A        | N/A        | 1            | 1          | 9223372036854775807 | N     | SIMPLE |
+---------------+--------+------------+------------+------------+--------------+------------+---------------------+-------+--------+
8 rows in set (0.01 sec)