注意:以下内容基于OB V3版本。
OB既支持主键表,也支持无主键表,但是无主键表全部都会创建隐藏主键,无论是Oracle租户还是MySQL租户,其隐藏主键都是兼容MySQL的自增列。
主键一般有两个特性:
- 主键列的值非空并且不能为NULL。
- 主键列的值在表里唯一。
OB的主键除了包含主键的一般特性外,还有两个自己的特性:
- 每张表最多只能有一个主键。
- 主键列的数量最多不能超过64个,且主键列中单行的最大长度不能超过16KB。
以上规则适用于所有类型的OB租户。
另外,特别强调,OB的主键只有在建表语句中才有效,如果建表后想通过alter语句添加主键,是不行的。以下为实验:
创建无主键表
create table lg_test_no_pk(lg_id int,lg_name varchar(30),lg_job varchar(40));
给无主键表添加主键
alter table lg_test_no_pk add primary key (lg_id);
报错如下:
失败原因:
ErrorCode = 1235, SQLState = 0A000, Details = Not supported feature or function
查看无主键表可以通过__pk_increment列实现,但是正常用户无法查看该列,只有内部用户__oceanbase_inner_drc_user才可以查看__pk_increment列。
使用正常用户查看__pk_increment
失败原因:
ErrorCode = 1054, SQLState = 42S22, Details = Unknown column '__pk_increment' in 'field list' If column exists but type cannot be identified (example 'select ? `field1` from dual'). Use CAST function to solve this problem (example 'select CAST(? as integer) `field1` from dual')
创建用户__oceanbase_inner_drc_user
create user __oceanbase_inner_drc_user identified by 'root';
grant select on *.* to __oceanbase_inner_drc_user;
通过用户__oceanbase_inner_drc_user登录,然后执行查询,下图可以看到能查出隐藏列。
OB中Oracle和MySQL类型自增列满足以下三个原则:
-
多分区全局唯一
-
比如一张表有3个分区,每个分区隐藏列的值永远不会相同。
-
-
语句内连续递增
-
第一个分区第一次插入1,第二次插入2,第三次在第二个分区插入为1000001,第四次在第二个分区插入为1000002。每次语句在分区内都是连续递增的。
-
-
生成的自增列值大于用户显式插入的值
-
当给自增列插入n时,下次插入数据不指定自增列,自增列的值永远大于插入的n。
-
引用:
(如何查看无主键表隐藏主键)https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000207715