×
技术社区 >  技术博客 >  OceanBase MySQL 租户自增列查询指南

OceanBase MySQL 租户自增列查询指南

一、 问题描述

在OceanBase的Mysql租户模式下,使用information_schema.TABLES不能查到自增列下一个起点值,如何去查询自增列的值?

二、 问题分析

在MySQL中,查看自增列(通常是主键)的当前值,可以使用几种不同的方法,这取决于具体需求和使用的MySQL版本。下面是一些常用的方法:

MySQL 查看表自增值的下一个起点值的方法

方法一:使用AUTO_INCREMENT属性

查看一个表当前的自增列的下一个值(即下一次插入时将使用的值),可以通过查询 information_schema 数据库中的 TABLES 表获得。

SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name' 
AND TABLE_NAME = 'your_table';

方法二:使用SHOW TABLE STATUS命令

SHOW TABLE STATUS LIKE 'your_table';

在结果中,查找Auto_increment列的值。

方法三:使用 SHOW CREATE TABLE命令

SHOW CREATE TABLE 'your_table';

在结果中,查找Auto_increment列的值,注意表名不要加引号。

OB MySQL 租户验证 MySQL 查看表自增值的下一个起点值的方法

在OceanBase 4.3.5版本中经验证

具体方法 是否可用
方法一 否
方法二 是
方法三 是

具体的实验验证如下:实验测试表

CREATE DATABASE test_cnt;
USE test_cnt;

CREATE TABLE demo1_incr_replace (
    id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
    uk   INT NOT NULL COMMENT '业务唯一键',
    val  INT NOT NULL DEFAULT 0,
    gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    tid  INT NOT NULL DEFAULT 0,
    UNIQUE KEY ukey_uk (uk)
) AUTO_INCREMENT = 1 AUTO_INCREMENT_MODE = 'ORDER';

方法一的测试结果:AUTO_INCREMENT的值为空

SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,AUTO_INCREMENT
    -> FROM information_schema.TABLES 
    -> WHERE TABLE_SCHEMA = 'test_cnt' 
    -> AND TABLE_NAME = 'demo1_incr_replace';
+--------------+--------------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME         | TABLE_TYPE | AUTO_INCREMENT |
+--------------+--------------------+------------+----------------+
| test_cnt     | demo1_incr_replace | BASE TABLE |           NULL |
+--------------+--------------------+------------+----------------+

方法二的测试结果:Auto_increment:1001

SHOW TABLE STATUS LIKE 'demo1_incr_replace' \G;
*************************** 1. row ***************************
           Name: demo1_incr_replace
         Engine: oceanbase
        Version: 0
     Row_format: DYNAMIC
           Rows: 9
 Avg_row_length: 100
    Data_length: 900
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: 1001
    Create_time: 2026-06-23 12:04:19.066488
    Update_time: 2026-06-23 12:04:19.191438
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: 0
 Create_options: ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
        Comment: 
1 row in set (0.16 sec)

方法三的测试结果:AUTO_INCREMENT = 1001

 SHOW CREATE TABLE demo1_incr_replace \G;
*************************** 1. row ***************************
       Table: demo1_incr_replace
Create Table: CREATE TABLE `demo1_incr_replace` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `uk` int(11) NOT NULL COMMENT '业务唯一键',
  `val` int(11) NOT NULL DEFAULT '0',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `tid` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ukey_uk` (`uk`) BLOCK_SIZE 16384 LOCAL
) ORGANIZATION HEAP AUTO_INCREMENT = 1001 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set (0.00 sec)

三、为什么information_schema.TABLES查到的是null?

结合OceanBase的开源代码:information_schema.TABLES的视图定义中 cast(NULL as unsigned) as AUTO_INCREMENT,所以AUTO_INCREMENT 就是null,也就是说AUTO_INCREMENT不是实时计算,其取值就是null,因此不能使用该方法查询。

相关的代码片段

select
  /*+ no_use_nl(ts)*/
  cast('def' as char(512)) as TABLE_CATALOG,
  cast(b.database_name as char(64) IGNORE) collate utf8mb4_name_case as TABLE_SCHEMA,
  cast(a.table_name as char(64) IGNORE) collate utf8mb4_name_case as TABLE_NAME,
  cast(
    case
    when (
      a.database_id = 201002
      or a.table_type = 1
    ) then 'SYSTEM VIEW'
    when a.table_type in (0, 2) then 'SYSTEM TABLE'
    when a.table_type = 4 then 'VIEW'
    when a.table_type = 14 then 'EXTERNAL TABLE'
    else 'BASE TABLE'
    end
      as char(64)
  ) as TABLE_TYPE,
  cast(
    case
    when a.table_type in (0, 3, 5, 6, 7, 11, 12, 13, 15) then 'InnoDB'
    else 'MEMORY'
    end
      as char(64)
  ) as ENGINE,
  cast(NULL as unsigned) as VERSION,
  cast(a.store_format as char(10)) as ROW_FORMAT,
  cast(coalesce(ts.row_cnt, 0) as unsigned) as TABLE_ROWS,
  cast(coalesce(ts.avg_row_len, 0) as unsigned) as AVG_ROW_LENGTH,
  cast(coalesce(ts.data_size, 0) as unsigned) as DATA_LENGTH,
  cast(NULL as unsigned) as MAX_DATA_LENGTH,
  cast(coalesce(idx_stat.index_length, 0) as unsigned) as INDEX_LENGTH,
  cast(NULL as unsigned) as DATA_FREE,
  cast(NULL as unsigned) as AUTO_INCREMENT,
  ......

其他内容上面cast(NULL as unsigned) as AUTO_INCREMENT 后面无关的内容......省略。

结论

在4.3.5开源的版本OceanBase的Mysql租户模式下,使用information_schema.TABLES不能查到自增列下一个起点值,OceanBase有关自增列不同的版本实现可能会有差异,具体以相关的官网文档说明和测试验证为准。

information_schema.TABLES只是做了mysql兼容视图,建议使用:SHOW TABLE STATUS或者SHOW CREATE TABLE方式来查看。

精选推荐