联系我们
18591797788
hubin@rlctech.com
北京市海淀区中关村南大街乙12号院天作国际B座1708室
18681942657
lvyuan@rlctech.com
上海市浦东新区商城路660号乐凯大厦26c-1
18049488781
xieyi@rlctech.com
广州市越秀区东风东路华宫大厦808号1608房
029-81109312
service@rlctech.com
西安市高新区天谷七路996号西安国家数字出版基地C座501
在OceanBase的Mysql租户模式下,使用information_schema.TABLES不能查到自增列下一个起点值,如何去查询自增列的值?
在MySQL中,查看自增列(通常是主键)的当前值,可以使用几种不同的方法,这取决于具体需求和使用的MySQL版本。下面是一些常用的方法:
查看一个表当前的自增列的下一个值(即下一次插入时将使用的值),可以通过查询 information_schema 数据库中的 TABLES 表获得。
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'your_table';
SHOW TABLE STATUS LIKE 'your_table';
在结果中,查找Auto_increment列的值。
SHOW CREATE TABLE 'your_table';
在结果中,查找Auto_increment列的值,注意表名不要加引号。
在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';
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 |
+--------------+--------------------+------------+----------------+
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)
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)
结合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方式来查看。