OB主键表和无主键表学习

本文介绍了OB数据库对主键的支持,包括主键的定义、限制(如单表仅一个主键,最大列数和长度),以及无主键表的隐藏主键机制。还提到不能在建表后通过alter语句添加主键,以及查看无主键表隐藏主键的方法和自增列的原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:以下内容基于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lglovegq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值