閱讀424 返回首頁    go 小米


全局唯一數字序列使用__開發手冊_分布式關係型數據庫 DRDS-阿裏雲

DRDS全局唯一數字序列(64位數字,對應MySQL中BIGINT類型,以下簡稱為sequence)的主要目標是為了保證所定義唯一字段中的數據的全局唯一(比如PRIMARY KEY,UNIQUE KEY等)和有序遞增,但不保證連續性,用戶不能依賴sequence的連續性進行任何業務操作。

DRDS中的sequence主要有兩類用法:

  • 隱式sequence,在為主鍵定義AUTO_INCREMENT後,用於自動填充主鍵,由DRDS自動維護;

  • 顯式sequence,通過DRDS的DDL語法創建和維護,可以獨立使用。

主鍵自動填充

DRDS能夠支持INSERT時自動填充主鍵(BIGINT類型,設定為PRIMARY KEY、AUTO_INCREMENT)。這樣就意味著,在INSERT語句中若沒有指定主鍵,DRDS會自動地將主鍵填充進來,請參考以下示例:

  1. mysql> insert into users (name,address,gmt_created,gmt_modified,intro) values ('sun','hz',now(),now(),'aa');
  2. Query OK, 1 row affected (0.02 sec)
  3. mysql> select last_insert_id();
  4. +------------------+
  5. | LAST_INSERT_ID() |
  6. +------------------+
  7. | 5018 |
  8. +------------------+
  9. 1 row in set (0.00 sec)

您也可以使用標準的JDBC接口來獲取LastInsertId,與普通的MySQL一致。

注意:當創建DRDS庫為非拆分模式,DRDS自動填充主鍵機製失效,由MySQL生成。

創建、查詢、更新和刪除sequence

在以下sequence語法中:

  • 大寫單詞為關鍵字;
  • 小寫斜體單詞為需要用戶指定的名稱或數值;
  • 中括號內包含的為可選項;
  • 尖括號內包含的為必填項;
  • 豎線分隔的關鍵詞為“或”的關係,即多選一。

請注意,上述大小寫的區分僅為語法說明的目的,在語句的實際使用中並不區分大小寫。

創建sequence

創建sequence語句如下:

CREATE SEQUENCE < sequence name > [ START WITH < numeric value > ] [ INCREMENT BY < numeric value > ] [ MAXVALUE < numeric value > ] [ CYCLE | NOCYCLE ]

START WITH:代表sequence的起始值,若未指定,則默認值為1;

INCREMENT BY:代表sequence每次增長時的增量值(或稱為間隔值或步長),若未指定,則默認值為1;

MAXVALUE:代表sequence允許的最大值,若未指定,則默認值為有符號長整形(Signed BIGINT)的最大正值;

CYCLE或NOCYCLE:兩者隻能選擇其一,代表當sequence值增長到最大值後,是否允許繼續循環(即仍從START WITH開始)使用sequence值,若未指定,則默認值為NOCYCLE。

示例:

  • 指定所有參數:

    1. mysql> create sequence sample_seq start with 10 increment by 2 maxvalue 10000000 nocycle;
    2. Query OK, 1 row affected (0.01 sec)
  • 指定部分參數,其餘使用默認值:

    1. mysql> create sequence sample_seq_part start with 100;
    2. Query OK, 1 row affected (0.01 sec)
  • 不指定參數,全部使用默認值:

    1. mysql> create sequence sample_seq_default;
    2. Query OK, 1 row affected (0.01 sec)

查詢sequence

查詢sequence語句如下:

SHOW SEQUENCES

示例:

  1. mysql> show sequences;
  2. +------+-------------------------------+--------+---------------------+
  3. | ID | NAME | VALUE | GMT_MODIFIED |
  4. +------+-------------------------------+--------+---------------------+
  5. | 1 | AUTO_SEQ_USERS | 5000 | 2014-08-09 18:20:28 |
  6. | 2 | AUTO_SEQ_ITEMS | 5000 | 2014-06-18 16:08:06 |
  7. | 3 | AUTO_SEQ_ORDERS | 6000 | 2014-06-18 16:08:06 |
  8. | 4 | sample_seq | 12000 | 2014-08-09 18:21:28 |
  9. | 5 | AUTO_SEQ_DEF | 2000 | 2014-07-04 17:55:36 |
  10. | 6 | WEBO_COMMENTS | 0 | 2014-07-13 19:38:55 |
  11. | 7 | AUTO_SEQ_ABC | 66000 | 2014-07-16 15:10:43 |
  12. | 8 | AUTO_SEQ_CATEGORY | 2000 | 2014-07-17 15:53:27 |
  13. | 9 | AUTO_SEQ_USER | 2000 | 2014-07-25 16:54:29 |
  14. | 10 | AUTO_SEQ_CLUSTER | 2000 | 2014-07-27 15:58:34 |
  15. | 11 | AUTO_SEQ_SPE_CLUSTER | 2000 | 2014-07-28 16:21:30 |
  16. | 12 | AUTO_SEQ_A | 2000 | 2014-07-28 16:22:08 |
  17. +------+-------------------------------+--------+---------------------+
  18. 17 rows in set (0.04 sec)

更新sequence

更新sequence語句如下:

ALTER SEQUENCE < sequence name > START WITH < numeric value > [ INCREMENT BY < numeric value > ] [ MAXVALUE < numeric value > ] [ CYCLE | NOCYCLE ]

START WITH:代表sequence的起始值,是必選項,該參數會更新當前維護的sequence值;若想保留更新sequence之前的原sequence值,請先查詢原值並用該參數指定;

INCREMENT BY:代表sequence每次增長時的增量值(或稱為間隔值或步長),若未指定,則沿用原值;

MAXVALUE:代表sequence允許的最大值,若未指定,則沿用原值;

CYCLE或NOCYCLE:兩者隻能選擇其一,代表當sequence值增長到最大值後,是否允許繼續循環(即仍從START WITH開始)使用sequence值,若未指定,則沿用原值。

示例:

  • 指定所有參數:

    1. mysql> alter sequence sample_seq start with 1000 increment by 1 maxvalue 10000000 cycle;
    2. Query OK, 1 row affected (0.01 sec)
  • 指定部分參數,其餘沿用原值:

    1. mysql> alter sequence sample_seq start with 100;
    2. Query OK, 1 row affected (0.01 sec)

刪除sequence

刪除sequence語句如下:

DROP SEQUENCE < sequence name >

示例:

  1. mysql> drop sequence sample_seq;

常用操作及常見問題處理

獲取顯式sequence值

可以通過DRDS指定SQL獲取最新sequence值, 語法是:

< sequence name >.NEXTVAL

示例:

  1. select sample_seq.nextVal from dual;
  2. +--------------------+
  3. | SAMPLE_SEQ.NEXTVAL |
  4. +--------------------+
  5. | 101001 |
  6. +--------------------+
  7. 1 row in set (0.04 sec)

或者可以把這個SAMPLE_SEQ.nextVal當做一個值寫入sql中:

  1. mysql> insert into some_users (name,address,gmt_create,gmt_modified,intro) values ('sun',SAMPLE_SEQ.nextVal,now(),now(),'aa');
  2. Query OK, 1 row affected (0.01 sec)

如何處理主鍵衝突

當您直接在RDS中寫入了數據,而對應的主鍵值不是DRDS生成的sequence值,那麼後續讓DRDS自動生成主鍵寫入數據庫,可能會和這些數據發生主鍵衝突,一般我們可以通過以下幾步解決問題:

1、通過DRDS指定SQL來查看當前已有sequence(AUTO_SEQ_是DRDS自動加上的sequence名字的前綴,USERS指表名):

  1. mysql> show sequences;
  2. +------+-------------------------------+--------+---------------------+
  3. | ID | NAME | VALUE | GMT_MODIFIED |
  4. +------+-------------------------------+--------+---------------------+
  5. | 1 | AUTO_SEQ_USERS | 5000 | 2014-08-09 18:20:28 |
  6. | 2 | AUTO_SEQ_ITEMS | 5000 | 2014-06-18 16:08:06 |
  7. | 3 | AUTO_SEQ_ORDERS | 6000 | 2014-06-18 16:08:06 |
  8. +------+-------------------------------+--------+---------------------+
  9. 3 rows in set (0.04 sec)

2、比如USERS表有衝突,並且USERS表主鍵是ID,那麼從DRDS獲取這個表最大主鍵值:

  1. mysql> select max(id) from USERS;
  2. +----------+
  3. | MAX(ID) |
  4. +----------+
  5. | 8231 |
  6. +----------+
  7. 1 rows in set (0.04 sec)

3、更新DRDS sequence表中對應的值,我們更新成比8231要大的值,比如9000,更新完成後,後續insert DRDS生成自增主鍵將不再報錯:

  1. mysql> alter sequence AUTO_SEQ_USERS start with 9000;
  2. Query OK, 1 row affected (0.01 sec)

最後更新:2016-11-23 17:31:29

  上一篇:go DRDS數據導入__開發手冊_分布式關係型數據庫 DRDS-阿裏雲
  下一篇:go 遍曆全表操作__開發手冊_分布式關係型數據庫 DRDS-阿裏雲