424
小米
全局唯一數字序列使用__開發手冊_分布式關係型數據庫 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會自動地將主鍵填充進來,請參考以下示例:
mysql> insert into users (name,address,gmt_created,gmt_modified,intro) values ('sun','hz',now(),now(),'aa');
Query OK, 1 row affected (0.02 sec)
mysql> select last_insert_id();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 5018 |
+------------------+
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。
示例:
指定所有參數:
mysql> create sequence sample_seq start with 10 increment by 2 maxvalue 10000000 nocycle;
Query OK, 1 row affected (0.01 sec)
指定部分參數,其餘使用默認值:
mysql> create sequence sample_seq_part start with 100;
Query OK, 1 row affected (0.01 sec)
不指定參數,全部使用默認值:
mysql> create sequence sample_seq_default;
Query OK, 1 row affected (0.01 sec)
查詢sequence
查詢sequence語句如下:
SHOW SEQUENCES
示例:
mysql> show sequences;
+------+-------------------------------+--------+---------------------+
| ID | NAME | VALUE | GMT_MODIFIED |
+------+-------------------------------+--------+---------------------+
| 1 | AUTO_SEQ_USERS | 5000 | 2014-08-09 18:20:28 |
| 2 | AUTO_SEQ_ITEMS | 5000 | 2014-06-18 16:08:06 |
| 3 | AUTO_SEQ_ORDERS | 6000 | 2014-06-18 16:08:06 |
| 4 | sample_seq | 12000 | 2014-08-09 18:21:28 |
| 5 | AUTO_SEQ_DEF | 2000 | 2014-07-04 17:55:36 |
| 6 | WEBO_COMMENTS | 0 | 2014-07-13 19:38:55 |
| 7 | AUTO_SEQ_ABC | 66000 | 2014-07-16 15:10:43 |
| 8 | AUTO_SEQ_CATEGORY | 2000 | 2014-07-17 15:53:27 |
| 9 | AUTO_SEQ_USER | 2000 | 2014-07-25 16:54:29 |
| 10 | AUTO_SEQ_CLUSTER | 2000 | 2014-07-27 15:58:34 |
| 11 | AUTO_SEQ_SPE_CLUSTER | 2000 | 2014-07-28 16:21:30 |
| 12 | AUTO_SEQ_A | 2000 | 2014-07-28 16:22:08 |
+------+-------------------------------+--------+---------------------+
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值,若未指定,則沿用原值。
示例:
指定所有參數:
mysql> alter sequence sample_seq start with 1000 increment by 1 maxvalue 10000000 cycle;
Query OK, 1 row affected (0.01 sec)
指定部分參數,其餘沿用原值:
mysql> alter sequence sample_seq start with 100;
Query OK, 1 row affected (0.01 sec)
刪除sequence
刪除sequence語句如下:
DROP SEQUENCE < sequence name >
示例:
mysql> drop sequence sample_seq;
常用操作及常見問題處理
獲取顯式sequence值
可以通過DRDS指定SQL獲取最新sequence值, 語法是:
< sequence name >.NEXTVAL
示例:
select sample_seq.nextVal from dual;
+--------------------+
| SAMPLE_SEQ.NEXTVAL |
+--------------------+
| 101001 |
+--------------------+
1 row in set (0.04 sec)
或者可以把這個SAMPLE_SEQ.nextVal當做一個值寫入sql中:
mysql> insert into some_users (name,address,gmt_create,gmt_modified,intro) values ('sun',SAMPLE_SEQ.nextVal,now(),now(),'aa');
Query OK, 1 row affected (0.01 sec)
如何處理主鍵衝突
當您直接在RDS中寫入了數據,而對應的主鍵值不是DRDS生成的sequence值,那麼後續讓DRDS自動生成主鍵寫入數據庫,可能會和這些數據發生主鍵衝突,一般我們可以通過以下幾步解決問題:
1、通過DRDS指定SQL來查看當前已有sequence(AUTO_SEQ_是DRDS自動加上的sequence名字的前綴,USERS指表名):
mysql> show sequences;
+------+-------------------------------+--------+---------------------+
| ID | NAME | VALUE | GMT_MODIFIED |
+------+-------------------------------+--------+---------------------+
| 1 | AUTO_SEQ_USERS | 5000 | 2014-08-09 18:20:28 |
| 2 | AUTO_SEQ_ITEMS | 5000 | 2014-06-18 16:08:06 |
| 3 | AUTO_SEQ_ORDERS | 6000 | 2014-06-18 16:08:06 |
+------+-------------------------------+--------+---------------------+
3 rows in set (0.04 sec)
2、比如USERS表有衝突,並且USERS表主鍵是ID,那麼從DRDS獲取這個表最大主鍵值:
mysql> select max(id) from USERS;
+----------+
| MAX(ID) |
+----------+
| 8231 |
+----------+
1 rows in set (0.04 sec)
3、更新DRDS sequence表中對應的值,我們更新成比8231要大的值,比如9000,更新完成後,後續insert DRDS生成自增主鍵將不再報錯:
mysql> alter sequence AUTO_SEQ_USERS start with 9000;
Query OK, 1 row affected (0.01 sec)
最後更新:2016-11-23 17:31:29
上一篇:
DRDS數據導入__開發手冊_分布式關係型數據庫 DRDS-阿裏雲
下一篇:
遍曆全表操作__開發手冊_分布式關係型數據庫 DRDS-阿裏雲
刪除截圖配置__直播流操作接口_API 手冊_CDN-阿裏雲
負載均衡是否支持CNAME__常見問題_負載均衡-阿裏雲
什麼是公鑰和私鑰?__常見問題_產品常見問題_證書服務-阿裏雲
日誌清洗中係統字段介紹__最佳實踐_業務實時監控服務 ARMS-阿裏雲
監控項介紹__性能監控_用戶指南(Linux)_數據管理-阿裏雲
創建ODPS表__基礎示例—完整數據開發_場景教程_大數據開發套件-阿裏雲
STS常見問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
查看解析量統計__使用手冊_HTTPDNS-阿裏雲
環境準備__MQTT 接入準備_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
Hive 作業配置__作業_用戶指南_E-MapReduce-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲