当前位置: 首页 > news >正文

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)而变化,不适合用作业务逻辑。

相关文章:

  • iOS APP上架App Store实践:通过自动化流程和辅助工具高效提
  • 【Python】.pyz:源码与依赖打包
  • IPv6 | 地址解析 / 地址管理 / 邻居发现协议(NDP)/ 无状态自动配置(SLAAC)
  • Spring Boot自动配置原理
  • Spring Boot + MyBatis + Vue:全栈开发中的最佳实践
  • ASP3605芯片在煤炭设备电源管理中的可靠性设计与应用探索
  • mapbox进阶,mapbox-gl-draw绘图插件扩展,编辑支持右键取消节点
  • SAP调用api
  • 创客匠人服务体系解析:知识 IP 变现的全链路赋能模型
  • 【网工】华为配置专题进阶篇③
  • FPGA--hello
  • MySQL慢SQL优化全攻略:从诊断到调优
  • C++ 学习笔记精要(二)
  • Android Kotlin 用法对比Java使用小结
  • Dilworth 定理 学习笔记
  • 智能危险品搬运机器人市场报告:行业趋势与未来展望
  • qt常用控件--01
  • 对于网站业务安全SCDN都能够从哪些方面进行保护?
  • Kafka协议开发总踩坑?3步拆解二进制协议核心
  • IP 风险画像网络违规行为识别
  • 海尔网站建设的目标是什么/网络推广产品公司
  • wordpress 如何加速/邯郸网站建设优化
  • 永康做网站的/百度首页百度一下
  • 去国外做网站/百度搜索网页
  • 做网站的经历感想/微信管理系统软件
  • 网站制作价格表模板/外链大全