首页 > 数据库 > 国内数据库 > OceanBase MySQL 租户自增列查询指南
在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方式来查看。
如果在操作过程中遇到问题,欢迎在评论区留言交流,后续我们会持续分享更多实战运维干货,记得 关注不迷路 ,下次见~
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047467/viewspace-3178915/ ,如需转载,请注明出处,否则将追究法律责任。