在分库分表的情况下,数据库自增主键无法保证自增主键的全局唯一。为此,dble提供了全局序列,并且针对不同应用场景提供了多种实现方式。
要应用全局序列,首先需要在server.xml 中配置(参见 1.3 server.xml):
<system>
<property name="sequnceHandlerType">1</property>
</system>
根据sequnceHandlerType的类型配置具体的实现:
其次,使用全局序列的表要在schema.xml中配置表格并指定其自增列(参见1.2 schemal.xml)。
自增列的指定逻辑: 以显式声明的以incrementColumn中的指定为准
//有显式指定incrementColumn=pid,则pid作为自增列
<table name="table1" cacheKey="id" dataNode="dn1,dn2" rule="two_node_hash" incrementColumn="pid"/>
配置之后的使用示例:
insert into table1(name) values('test');
insert into table1 set name = 'test';
每一个全局序列的具体实现配置将在各个小节进行详细说明;其功能将在2.2 全局序列进行详细描述。
与MYSQL差异
在MySQL中要求自增列必须含有唯一键,在dble中对于表格的自增列的唯一属性不做要求,但是在dble进行插入数据操作的时候不允许用户手动插入自增列的数值,自增列只能由dble自己生成的ID进行填充
并且存在以下情形和mysql的行为不一致
table1拥有列aid,bid,cid,did 其中bid为在dble中的自增列
insert into table1 values(1,2,3)
和以下sql的效果相等
insert into table1 set aid = 1,cid = 2,did = 3
特别提醒 在dble中全局序列只在生成的时候确保其唯一性,在之后的过程中用户被允许使用update或者replace语句进行更新自增字段(特例:自增字段同时也是分片字段是除外)。 这给予用户提供了充足的修改空间但同时要求用户在更新自增字段的时候有足够的谨慎和了解