mysql查询使用`_rowid` 虚拟列
在 MySQL 中,_rowid
是一个虚拟列,可以用来查询 InnoDB 表的内部行 ID(当表没有显式定义主键时)。以下是使用 _rowid
的 SQL 查询示例:
1. 基本查询(适用于没有主键的表)
SELECT _rowid AS internal_row_id, -- 显示内部行IDt.* -- 查询所有列
FROM your_table_name t
LIMIT 10;
2. 检查表是否支持 _rowid
-- 检查表是否有主键或唯一索引
SHOW INDEX FROM your_table_name;-- 如果表没有主键,且至少有一个非空的唯一整数列,`_rowid` 会指向该列
-- 否则,MySQL 会使用内部隐藏的 rowid
3. 注意事项
-
_rowid
的限制:- 仅适用于 InnoDB 表。
- 如果表有主键,
_rowid
会指向主键列。 - 如果表没有主键但有唯一非空整数列,
_rowid
会指向该列。 - 如果表既没有主键也没有唯一非空整数列,
_rowid
会显示内部隐藏的行 ID(但可能不稳定,不建议依赖它)。
-
替代方案:
- 如果
_rowid
不可用,可以使用ROW_NUMBER()
(MySQL 8.0+):SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num,other_columns FROM your_table_name;
- 或者使用变量模拟行号(MySQL 5.7+):
SET @row_number = 0; SELECT (@row_number:=@row_number + 1) AS row_num,other_columns FROM your_table_name;
- 如果
4. 最佳实践
- 显式定义主键:建议在表中添加
id INT AUTO_INCREMENT PRIMARY KEY
,避免依赖_rowid
。 - 避免依赖内部行 ID:
_rowid
可能因数据重组(如OPTIMIZE TABLE
)而变化,不适合用作业务逻辑。