查看某个用户下的所有空表

今天在群里有人问如何查看某个用户下的所有空表,有人回答是写PL/SQL
SQL> DECLARE
  2  v_table tabs.table_name%TYPE;
  3  v_sql VARCHAR2(888);
  4  v_q NUMBER;
  5  CURSOR c1 IS
  6  SELECT table_name tn FROM tabs;
  7  TYPE c IS REF CURSOR;
  8  c2 c;
  9  BEGIN
 10  DBMS_OUTPUT.PUT_LINE('以下为空数据表的表名:');
 11  FOR r1 IN c1 LOOP
 12  v_table :=r1.tn;
 13  v_sql :='SELECT count(*) q FROM '||v_table||' where rownum = 1';
 14  OPEN c2 FOR v_sql;
 15  LOOP
 16  FETCH c2 INTO v_q;
 17  EXIT WHEN c2%NOTFOUND;
 18  IF v_q=0 THEN
 19  DBMS_OUTPUT.PUT_LINE(v_table);
 20  END IF;
 21  END LOOP;
 22  CLOSE c2;
 23  END LOOP;
 24  EXCEPTION
 25  WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error occurred');
 26  END;
 27  /
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> /
以下为空数据表的表名:
T_FILE_INFO_RAW
T_DOSSIER_INFO_RAW
T_FONDS_INFO_RAW
其实不用那么麻烦,而且表如果很多的话,执行会很慢
先收集下用户的信息
SQL> exec dbms_stats.gather_schema_stats(user);
PL/SQL 过程已成功完成。
再查看user_tables数据字典
SQL> exec dbms_stats.gather_schema_stats(user);
PL/SQL 过程已成功完成。
-------------------- ----------
T_FILE_INFO_RAW      0
T_DOSSIER_INFO_RAW   0
T_FONDS_INFO_RAW     0
验证结果是否准确
SQL> select count(*) from T_FILE_INFO_RAW;
COUNT(*)
       0
SQL> select count(*) from T_DOSSIER_INFO_RAW;
COUNT(*)
       0
SQL> select count(*) from T_FONDS_INFO_RAW;
COUNT(*)
       0
向T_FONDS_INFO_RAW表插入几条数据,在查看下
SQL> insert into T_FONDS_INFO_RAW (FILE_SUM) values(1111);
已创建 1 行。
SQL> insert into T_FONDS_INFO_RAW select * from T_FONDS_INFO_RAW;
已创建 1 行。
SQL> /
已创建2行。
SQL> /
已创建4行。
SQL> commit;
提交完成。
在收集下用户的信息
SQL> exec dbms_stats.gather_schema_stats(user);
PL/SQL 过程已成功完成。
SQL> select table_name,num_rows from user_tables;
TABLE_NAME             NUM_ROWS
------------------------------      ----------
T_FILE_INFO_RAW               0
T_DOSSIER_INFO_RAW           0
T_FONDS_INFO_RAW            8

SQL> select count(*) from T_FONDS_INFO_RAW;
COUNT(*)
       8
这种方法要比写PL/SQL方便得多。

<think>好的,用户问的是如何查询某个数据库中的所有的创建时间。之前他遇到了在Navicat运行SQL文件但没选数据库的问题,现在可能是在确认数据位置之后,想要进一步了解的结构信息,比如创建时间。 首先,我需要回忆MySQL中存储元数据的地方。通常,information_schema数据库的TABLES会有这些信息,特别是CREATE_TIME字段。用户可能需要知道具体的SQL语句,来获取这些信息。 然后,用户可能需要的是针对特定数据库的查询,所以要注意在WHERE子句中指定TABLE_SCHEMA。另外,可能需要提醒用户替换数据库名,比如用反引号包裹以防特殊字符。 另外,考虑到用户可能对information_schema不熟悉,需要解释一下这个系统视图的作用。还有,有时候CREATE_TIME可能不准确,比如被修改过,或者存储引擎的问题,可能需要提到这些限制。 另外,用户之前的问题是关于找不到的位置,所以这次的问题可能是为了进一步管理或验证的创建情况。可能需要提供多种方法,比如使用SHOW TABLE STATUS,这样他们可以选择更熟悉的语法。 还要考虑用户可能没有权限访问information_schema,或者不同MySQL版本的差异,可能需要提醒权限问题。此外,Navicat可能有图形界面可以查看创建时间,但用户可能更倾向于用SQL语句,所以还是以SQL方法为主。 最后,确保回答清晰,分步骤说明,给出示例,并指出注意事项,比如时间精度、存储引擎的影响等。这样用户可以根据自己的情况调整查询,解决问题。</think>在MySQL中查询指定数据库所有的创建时间,可以通过以下两种方法实现: 1. **通过information_schema系统视图查询(推荐方法)** ```sql SELECT TABLE_NAME AS '名', CREATE_TIME AS '创建时间' FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' ORDER BY CREATE_TIME DESC; ``` 2. **通过SHOW TABLE STATUS命令查询** ```sql SHOW TABLE STATUS FROM `你的数据库名`; ``` **参数说明**: - 将`你的数据库名`替换为实际数据库名称(建议使用反引号包裹特殊名称) - 在Navicat中执行时,双击结果集的`Create_time`字段可查看完整时间戳 **注意事项**: 1. 时间精度问题: - CREATE_TIME字段精确到秒级 - 实际存储时间取决于MySQL服务器时区设置 2. 特殊情况处理: - 当被`ALTER TABLE`修改后,CREATE_TIME不会更新 - 使用`CREATE TABLE ... AS SELECT`创建时,CREATE_TIME会记录实际创建时间 3. 存储引擎差异: - InnoDB引擎的时间记录准确 - MEMORY引擎的不会记录CREATE_TIME **扩展技巧**: 1. 同时查看大小和创建时间: ```sql SELECT TABLE_NAME, CREATE_TIME, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '大小(MB)' FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database'; ``` 2. 查询最近7天新建的: ```sql SELECT TABLE_NAME, CREATE_TIME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_database' AND CREATE_TIME >= NOW() - INTERVAL 7 DAY; ``` 如果查询结果为或时间显示异常,建议检查: 1. 当前用户是否有`SELECT`权限访问`information_schema`数据库 2. MySQL服务器时间是否正确同步 3. 是否使用了非标准存储引擎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值