如何在Firebird 4.0数据库中查询无记录的数据表?
Firebird 4.0 查询数据表行数/识别空表的语句
方法一:利用系统统计信息(高效但依赖统计更新)
Firebird的RDB$RELATION_STATS表存储了表的统计数据,结合RDB$RELATIONS可快速获取各表行数:
SELECT r.RDB$RELATION_NAME AS TABLE_NAME, COALESCE(s.RDB$RECORD_COUNT, 0) AS TABLE_ROWS FROM RDB$RELATIONS r LEFT JOIN RDB$RELATION_STATS s ON r.RDB$RELATION_NAME = s.RDB$RELATION_NAME WHERE r.RDB$SYSTEM_FLAG = 0 -- 过滤系统表 AND r.RDB$VIEW_BLR IS NULL -- 过滤视图 ORDER BY r.RDB$RELATION_NAME;
- 空表的
TABLE_ROWS会显示为0(统计已更新)或NULL(统计未更新)。 - 若统计信息过时,可执行
SET STATISTICS FOR <表名>;更新单表统计,或编写存储过程批量更新所有表。
方法二:查询实际行数(准确但大数据量下较慢)
如果需要绝对准确的行数,可通过动态SQL遍历所有用户表执行COUNT(*):
EXECUTE BLOCK RETURNS (TABLE_NAME VARCHAR(63), TABLE_ROWS BIGINT) AS DECLARE VARIABLE v_table_name VARCHAR(63); DECLARE VARIABLE v_sql VARCHAR(256); DECLARE VARIABLE v_count BIGINT; BEGIN FOR SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL ORDER BY RDB$RELATION_NAME INTO v_table_name DO BEGIN v_sql = 'SELECT COUNT(*) FROM "' || v_table_name || '"'; EXECUTE STATEMENT v_sql INTO v_count; TABLE_NAME = v_table_name; TABLE_ROWS = v_count; SUSPEND; END END
- 执行后会返回所有用户表的名称和准确行数,空表的
TABLE_ROWS为0。
删除所有空表(谨慎操作!)
确认空表清单后,可通过以下动态SQL批量删除空表:
EXECUTE BLOCK AS DECLARE VARIABLE v_table_name VARCHAR(63); DECLARE VARIABLE v_count BIGINT; BEGIN FOR SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL INTO v_table_name DO BEGIN EXECUTE STATEMENT 'SELECT COUNT(*) FROM "' || v_table_name || '"' INTO v_count; IF v_count = 0 THEN BEGIN EXECUTE STATEMENT 'DROP TABLE "' || v_table_name || '"'; END END END
注意:删除表前务必做好数据库备份,此操作不可逆!
内容的提问来源于stack exchange,提问作者Alexandre Vargas Konrad
相关产品推荐
相关产品推荐

