背景信息
什么是隱式序列
在傳統的單庫環境中,AUTO_INCREMENT是用于生成主鍵自增值的常用機制,能夠保證主鍵在單實例數據庫中的唯一性。然而,在分布式數據庫DRDS中,數據被分片存儲在多個存儲節點中,原有的自增機制將無法保證全局唯一性,因此DRDS引入了基于全局序列的隱式序列機制,用于替代傳統的AUTO_INCREMENT功能。
隱式序列與AUTO_INCREMENT的關系
在DRDS中,雖然通過添加AUTO_INCREMENT關鍵字實現自增,但實際不是調用數據庫原生的自增邏輯,而是通過隱式的全局序列實現唯一值生成。
注意
隱式序列由系統自動維護,無需用戶手動干預。
隱式序列的生命周期
隱式序列由系統在建表時自動創建,并在DROP表時自動刪除。
注意
不推薦用戶手動創建或刪除隱式序列,可能會造成ID沖突或數據一致性問題。
HINT路由下的行為差異
當使用HINT路由 + INSERT語句時,DBProxy無法改寫SQL,因此不會自動填充自增ID:
注意
不推薦在需要使用AUTO_INCREMENT功能的表中使用HINT路由。
以/*+TDDL:node('group1')*/ INSERT INTO test(value) VALUES(1); 為例,該命令將直接透傳到物理庫。若該表中的自增列未顯式給值,數據庫可能會使用默認值(例如0),若該值不唯一,則會報錯(例如Duplicate entry)。
使用限制
只有版本≥ 2.3.1的DBProxy實例支持隱式序列功能。
隱式序列必須為非循環序列:
循環序列無法滿足AUTO_INCREMENT遞增且唯一的要求。因此,DRDS創建的隱式序列默認為非循環序列,且不支持修改為循環序列。
隱式序列必須唯一綁定一個表使用:
隱式序列與表應一對一綁定,不能被多個表共用。
禁止手動在其他表中使用已存在的隱式序列。
語法說明
在DRDS中使用隱式序列功能,只需要在創建表時添加auto_increment關鍵字即可實現,實現過程如下:
創建表的時候添加
auto_increment語法,聲明某一列為自增主鍵。語法示例如下:
CREATE TABLE `test` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `value` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) AUTO_INCREMENT=1000;系統開始創建分片表,并自動創建一個隱式全局序列。
DRDS將自動為表中的
AUTO_INCREMENT字段創建一個隱式全局序列,命名為AUTO_SEQ_<TableName>,例如AUTO_SEQ_test。初始值
AUTO_INCREMENT=1000將作為該全局序列的起始值,默認每次自增1,即生成的序列為:1000,1001,1002...說明
默認起始值為1。
向分片表寫入數據的過程中,DBProxy自動將SQL語句改寫為自帶隱式全局序列的形式,保證自增序列全局唯一。
SQL改寫示例如下:
-- 原始SQL INSERT INTO test(value) VALUES(1); -- 改寫后SQL(在DBProxy層完成) INSERT INTO test(id, value) VALUES(auto_seq_test.nextval, 1);該示例表示,在執行
INSERT命令插入數據時,DRDS的中間件層(DBProxy)會自動將SQL語句改寫為顯式帶入序列值的形式(改寫后的SQL語句自動添加了auto_seq_test.nextval關鍵字),執行該命令時,系統會自動按照當前的隱式全局序列AUTO_SEQ_test排序情況繼續排序。