f (!empty($uidarr)) { $uids = array(); $update = array(); foreach ($uidarr as $_uid => $n) { $uids[] = $_uid; $update[$_uid] = array('articles-' => $n); 'mysql' != $conf['cache']['type'] and cache_delete('user-' . $_uid); } user_big_update(array('uid' => $uids), $update); } !empty($operate_create) && function_exists('operate_big_insert') and operate_big_insert($operate_create); return TRUE; } // 大数据量容易超时 删除用户时使用,删除主题 回复 栏目统计 附件 全站统计 function well_thread_delete_all_by_uid($uid) { // 用户主题数 $user = user_read_cache($uid); set_time_limit(0); // 删除所有回复 if ($user['comments']) { $postist = comment_pid_find_by_uid($uid, 1, $user['comments'], FALSE); $pidarr = array(); foreach ($postist as $val) { $pidarr[] = $val['pid']; } unset($postist); !empty($pidarr) and comment_delete_by_pids($pidarr); } if ($user['articles']) { // 如果主题、附件和回复数量太大会超时 $tidlist = thread_tid_find_by_uid($uid, 1, $user['articles'], FALSE, 'tid', array('tid')); $tidarr = array(); foreach ($tidlist as $val) { $tidarr[] = $val['tid']; } unset($tidlist); !empty($tidarr) and well_thread_delete_all($tidarr); } return TRUE; } // 搜索标题 function well_thread_find_by_keyword($keyword, $d = NULL) { if (empty($keyword)) return NULL; $db = $_SERVER['db']; $d = $d ? $d : $db; if (!$d) return FALSE; $threadlist = db_sql_find("SELECT * FROM `{$d->tablepre}website_thread` WHERE subject LIKE '%$keyword%' LIMIT 60;", 'tid', $d); if ($threadlist) { $threadlist = arrlist_multisort($threadlist, 'tid', FALSE); foreach ($threadlist as &$thread) { well_thread_format($thread); // 关键词标色 //$thread['subject'] = comment_highlight_keyword($thread['subject'], $keyword); } } return $threadlist; } // 查找 最后评论 lastpid function well_thread_find_lastpid($tid) { $arr = comment_pid_read(array('tid' => $tid), array('pid' => -1), array('pid')); $lastpid = empty($arr) ? 0 : $arr['pid']; return $lastpid; } // 更新最后的 uid function well_thread_update_last($tid) { if (empty($tid)) return FALSE; $lastpid = well_thread_find_lastpid($tid); if (empty($lastpid)) return FALSE; $lastpost = comment_read($lastpid); if (empty($lastpost)) return FALSE; $r = well_thread_update($tid, array('lastuid' => $lastpost['uid'])); return $r; } function well_thread_maxid() { $n = db_maxid('website_thread', 'tid'); return $n; } // 主题状态 0:通过 1~9 审核:1待审核 10~19:10退稿 11逻辑删除 function well_thread_format(&$thread) { global $gid, $uid, $forumlist; $conf = _SERVER('conf'); if (empty($thread)) return; $thread['create_date_fmt'] = humandate($thread['create_date']); $thread['last_date_fmt'] = humandate($thread['last_date']); $thread['create_date_fmt_ymd'] = date('Y-m-d', $thread['create_date']); $thread['last_date_fmt_ymd'] = date('Y-m-d', $thread['last_date']); $user = user_read_cache($thread['uid']); $onlinelist = online_user_list_cache(); $user['online_status'] = isset($onlinelist[$user['uid']]) ? 1 : 0; $thread['username'] = $user['username']; $thread['user_avatar_url'] = array_value($user, 'avatar_url'); $thread['user'] = user_safe_info($user); unset($user); $forum = array_value($forumlist, $thread['fid']); $thread['forum_name'] = array_value($forum, 'name'); $thread['forum_url'] = array_value($forum, 'url'); if ($thread['last_date'] == $thread['create_date']) { $thread['last_date_fmt'] = ''; $thread['lastuid'] = 0; $thread['lastusername'] = ''; } else { $lastuser = $thread['lastuid'] ? user_read_cache($thread['lastuid']) : array(); $thread['lastusername'] = $thread['lastuid'] ? $lastuser['username'] : lang('guest'); $thread['lastuser'] = $thread['lastuid'] ? user_safe_info($lastuser) : array(); unset($lastuser); } $thread['url'] = url('read-' . $thread['tid'], '', FALSE); if ($conf['url_rewrite_on'] > 1) { !empty($forum['well_alias']) and $thread['url'] = url(urlencode($forum['well_alias'])."-$thread[create_date]a$thread[tid]", '', FALSE); } else { $thread['url'] = url("read-$thread[create_date]a$thread[tid]", '', FALSE); } $thread['user_url'] = url('user-' . $thread['uid']); $thread['sticky_class'] = ''; if ($thread['sticky'] > 0) { if (1 == $thread['sticky']) { $thread['sticky_class'] = 'success'; } elseif (2 == $thread['sticky']) { $thread['sticky_class'] = 'warning'; } elseif (3 == $thread['sticky']) { $thread['sticky_class'] = 'danger'; } } $nopic = view_path() . 'img/nopic.png'; if ($thread['icon']) { $attach_dir_save_rule = array_value($conf, 'attach_dir_save_rule', 'Ym'); $day = date($attach_dir_save_rule, $thread['icon']); $thread_format_icon_default = 1; if (1 == $thread_format_icon_default) { // 本地文件绝对路径 $destfile = $conf['upload_path'] . 'thumbnail/' . $day . '/' . $thread['uid'] . '_' . $thread['tid'] . '_' . $thread['icon'] . '.jpeg'; // 本地 $thread['icon_fmt'] = is_file($destfile) ? file_path($thread['attach_on']) . 'thumbnail/' . $day . '/' . $thread['uid'] . '_' . $thread['tid'] . '_' . $thread['icon'] . '.jpeg' : $nopic; if (1 == $conf['attach_on'] && 1 == $thread['attach_on']) { // 云储存 $thread['icon_fmt'] = file_path($thread['attach_on']) . 'thumbnail/' . $day . '/' . $thread['uid'] . '_' . $thread['tid'] . '_' . $thread['icon'] . '.jpeg'; } elseif (2 == $conf['attach_on'] && 2 == $thread['attach_on']) { // 图床 未上传成功 本地图片在的话使用本地,不在则默认 $thread['icon_fmt'] = $thread['image_url'] ? $thread['image_url'] : $thread['icon_fmt']; } } } else { $thread['icon_fmt'] = $nopic; } // 回复页面 $thread['pages'] = ceil($thread['posts'] / $conf['comment_pagesize']); $thread['tag_fmt'] = $thread['tag'] ? xn_json_decode($thread['tag']) : ''; // 权限判断 $thread['allowupdate'] = ($uid == $thread['uid']) || forum_access_mod($thread['fid'], $gid, 'allowupdate'); $thread['allowdelete'] = (group_access($gid, 'allowuserdelete') and $uid == $thread['uid']) || forum_access_mod($thread['fid'], $gid, 'allowdelete'); $thread['allowtop'] = forum_access_mod($thread['fid'], $gid, 'allowtop'); $thread = well_thread_safe_info($thread); } function well_thread_format_last_date(&$thread) { if ($thread['last_date'] != $thread['create_date']) { $thread['last_date_fmt'] = humandate($thread['last_date']); } else { $thread['create_date_fmt'] = humandate($thread['create_date']); } } // 对 $threadlist 权限过滤 function well_thread_list_access_filter(&$threadlist, $gid) { global $forumlist; if (empty($threadlist)) return NULL; foreach ($threadlist as $tid => $thread) { if (empty($forumlist[$thread['fid']]['accesson'])) continue; if ($thread['sticky'] > 0) continue; if (!forum_access_user($thread['fid'], $gid, 'allowread')) { unset($threadlist[$tid]); } } } function well_thread_safe_info($thread) { unset($thread['userip'], $thread['user']['threads'], $thread['user']['posts'], $thread['user']['credits'], $thread['user']['golds'], $thread['user']['money']); empty($thread['user']) || $thread['user'] = user_safe_info($thread['user']); return $thread; } // 过滤安全数据 function well_thread_filter(&$val) { unset($val['userip'], $val['fid'], $val['flagid'], $val['type'], $val['user'], $val['create_date']); } //------------------------ 其他方法 ------------------------ // 集合主题tid,统一拉取,避免多次查询thread表 function thread_unified_pull($arr) { global $gid, $fid; $stickylist = array_value($arr, 'stickylist', array()); $tidlist = array_value($arr, 'tidlist', array()); //$fid = array_value($arr, 'fid'); // 合并过滤空数组 //$tidlist = array_filter($stickylist + $tidlist); $tidarrlist = $tidlist = $stickylist + $tidlist; // 版块自定义 list($flaglist, $flagtids) = flag_thread_by_fid($fid); empty($flagtids) || $tidarrlist += $flagtids; unset($flagtids); // 在这之前合并所有二维数组 tid值为键/array('tid值' => tid值) $tidarr = empty($tidarrlist) ? array() : arrlist_values($tidarrlist, 'tid'); // 在这之前使用array_merge()前合并所有一维数组 tid/array(1,2,3) if (empty($tidarr)) return NULL; $tidarr = array_unique($tidarr); // 主题相关统一遍历后再归类 $arrlist = well_thread_find($tidarr, count($tidarr)); // 过滤没有权限访问的主题 / filter no permission thread well_thread_list_access_filter($arrlist, $gid); $threadlist = array(); foreach ($arrlist as $_tid => &$_thread) { $_thread = well_thread_safe_info($_thread); // 归类列表数据 isset($tidlist[$_thread['tid']]) and $threadlist[$_tid] = $_thread; // flag thread if (!empty($flaglist)) { foreach ($flaglist as $key => $val) { if (isset($val['tids']) && in_array($_thread['tid'], $val['tids'])) { $flaglist[$key]['list'][array_search($_thread['tid'], $val['tids'])] = $_thread; ksort($flaglist[$key]['list']); } } } } // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); unset($arrlist, $tidlist); $arr = array('threadlist' => $threadlist, 'flaglist' => $flaglist); return $arr; } // read.php 详情页其他主题调用,集合tid统一拉取数据,最后归类 function thread_other_pull($thread) { global $forumlist, $gid; $fid = array_value($thread, 'fid'); $forum = array_value($forumlist, $fid); if (empty($forum)) return NULL; //$tid = array_value($thread, 'tid'); //$tag_fmt = array_value($thread, 'tag_fmt'); $arrlist = array(); $tidlist = array(); // 版块自定义 list($flaglist, $flagtids) = flag_thread_by_fid($fid); empty($flagtids) || $tidlist += $flagtids; unset($flagtids); // 在这之前合并所有二维数组 tid值为键/array('tid值' => tid值) $tidarr = empty($tidlist) ? array() : arrlist_values($tidlist, 'tid'); // 在这之前使用array_merge()前合并所有一维数组 tid/array(1,2,3) if (empty($tidarr)) return NULL; $tidarr = array_unique($tidarr); // 主题相关统一遍历后再归类 $threadlist = well_thread_find($tidarr, count($tidarr)); // 过滤没有权限访问的主题 / filter no permission thread well_thread_list_access_filter($threadlist, $gid); foreach ($threadlist as &$_thread) { $_thread = well_thread_safe_info($_thread); // flag thread if (!empty($flaglist)) { foreach ($flaglist as $key => $val) { if (isset($val['tids']) && in_array($_thread['tid'], $val['tids'])) { $flaglist[$key]['list'][array_search($_thread['tid'], $val['tids'])] = $_thread; ksort($flaglist[$key]['list']); } } } } unset($threadlist); if (!empty($flaglist)) { foreach ($flaglist as &$val) { $i = 0; if (!isset($val['list'])) continue; foreach ($val['list'] as &$v) { ++$i; $v['i'] = $i; } } $arrlist['flaglist'] = $flaglist; unset($flaglist); } return $arrlist; } //--------------------------cache-------------------------- // 已格式化 从缓存中读取,避免重复从数据库取数据 function well_thread_read_cache($tid) { global $conf; $key = 'website_thread_' . $tid; static $cache = array(); // 用静态变量只能在当前 request 生命周期缓存,跨进程需要再加一层缓存:redis/memcached/xcache/apc if (isset($cache[$key])) return $cache[$key]; if ('mysql' == $conf['cache']['type']) { $r = well_thread_read($tid); } else { $r = cache_get($key); if (NULL === $r) { $r = well_thread_read($tid); $r and cache_set($key, $r, 1800); } } $cache[$key] = $r ? $r : NULL; return $cache[$key]; } ?>MySQL:想实现sql语句进行批量删除数据库或表,而引发的熬夜探究
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

MySQL:想实现sql语句进行批量删除数据库或表,而引发的熬夜探究

网站源码admin6浏览0评论

MySQL:想实现sql语句进行批量删除数据库或表,而引发的熬夜探究

因为在自测过程中,创建了很多数据库,一个个手动删除属实有点对不起程序员这个身份,那么有没有简单的sql语句操作来进行批量删除数据库呢?于是便有了本篇文章

前情提示

删库跑路需谨慎, 放弃一切亦不易。


思路

了解到数据库或表的信息都保存在MySQL内置的 information_schema数据库的SCHEMATA表中,因此是否可以通过like查询information_schema中的相关表名,拼接SQL,进行批量删除。

实操

批量删除数据库(以前缀为 ‘test_’ 示例)

代码语言:javascript代码运行次数:0运行复制
SELECT CONCAT( 'DROP DATABASE ', SCHEMA_NAME, ';')
    FROM information_schema.SCHEMATA 
        WHERE information_schema.SCHEMATA.SCHEMA_NAME LIKE 'test_%';

如下图,查询结果是拼接好的sql,CV一下,执行即可

批量删除表(以前缀为 ‘df_’ 示例)

代码语言:javascript代码运行次数:0运行复制
SELECT CONCAT( 'DROP TABLE ', TABLE_NAME, ';')
    FROM information_schema.TABLES
        WHERE information_schema.TABLES.TABLE_NAME LIKE 'df_%';

如下图,同样查询结果是拼接好的sql,CV一下,执行即可

到这里已经实现了批量删除操作,下面是引发的探究,如时间紧张可先赞后看,保持良好习惯!


MySQL 5.7 自带的四个数据库

在Mysql5.7版本中自带4个数据库:information_schema、mysql、performance_schema、sys。

mysql

mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。(常用的如在mysql.user表中修改root用户的密码)

performance_schema

主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.7默认是开启的。

sys

sys库所有的数据源来自:performance_schema。目标是把performance_schema的复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。

information_schema

提供了访问数据库元数据的方式。(元数据是关于数据的数据,如数据库名、表名、列的数据类型和访问权限等。有时用于表述该信息的其他术语包括“数据词典”和“系统目录”) 该位置存储有关MySQL服务器维护的所有其他数据库的信息。

information_schema数据库表简介

该INFORMATION_SCHEMA数据库包含几个只读表。它们实际上是视图,而不是基表,因此没有与它们关联的文件,并且不能在它们上设置触发器。另外,没有使用该名称的数据库目录。虽然你可以选择INFORMATION_SCHEMA与一个默认的数据库USE 语句,你只能读取表的内容,不能执行 INSERT、UPDATE或 DELETE。

对于大多数INFORMATION_SCHEMA表,每个MySQL用户都有权访问它们,但只能看到表中与用户具有适当访问权限的对象相对应的行。在某些情况下(例如,表中的ROUTINE_DEFINITION列 INFORMATION_SCHEMA ROUTINES),特权不足的用户会看到NULL。某些表具有不同的特权要求;为此,在适用的表格说明中提到了这些要求。例如,InnoDB表(名称以开头的表INNODB_)需要PROCESS特权。

分表

information_schema库共计有61张表。下面仅以批量删除数据库和表涉及到分表展开简单介绍

SCHEMATA表

模式是数据库,因此 SCHEMATA表提供了有关数据库的信息。该SCHEMATA表包含以下列:

  • CATALOG_NAME:模式所属的目录的名称。此值始终为def
  • SCHEMA_NAME:模式的名称
  • DEFAULT_CHARACTER_SET_NAME:架构默认字符集
  • DEFAULT_COLLATION_NAME:模式默认排序规则
  • SQL_PATH:此值始终为NULL

模式名称也可以从该SHOW DATABASES语句中获得:

代码语言:javascript代码运行次数:0运行复制
mysql> show databases like ‘mysql’;
±-----------------+
| Database (mysql) |
±-----------------+
| mysql |
±-----------------+
1 row in set (0.00 sec)
————————————————
TABLES表

该TABLES表提供有关数据库中表的信息。该TABLES表包含以下列:

  • TABLE_CATALOG:该表所属的目录的名称。此值始终为def。
  • TABLE_SCHEMA:表所属的模式(数据库)的名称。
  • TABLE_NAME:表的名称。
  • TABLE_TYPE:BASE TABLE为一个表、 VIEW用于一个视图、SYSTEM VIEW为一个INFORMATION_SCHEMA 表。该TABLES表未列出 TEMPORARY表。
  • ENGINE:表的存储引擎。对于分区表,ENGINE显示所有分区使用的存储引擎的名称。
  • VERSION:表.frm 文件的版本号。
  • ROW_FORMAT:该行的存储格式(Fixed, Dynamic,Compressed, Redundant,Compact)。对于 MyISAM表,Dynamic 对应于myisamchk -dvv报告为的内容Packed。InnoDB表格式可以是Redundant或者 Compact使用时的 Antelope文件格式,或者 Compressed或Dynamic 使用时Barracuda的文件格式。
  • TABLE_ROWS:行数。一些存储引擎(例如 MyISAM)存储准确的计数。对于其他存储引擎(例如)InnoDB,该值是一个近似值,可能与实际值相差40%至50%。在这种情况下,请使用SELECT COUNT(*)以获得准确的计数。 TABLE_ROWS是NULL对 INFORMATION_SCHEMA表。 对于InnoDB表,行数只是SQL优化中使用的粗略估计。(如果InnoDB表已分区,则也是如此。)
  • AVG_ROW_LENGTH:平均行长。
  • DATA_LENGTH 对于MyISAM,DATA_LENGTH 是数据文件的长度(以字节为单位)。 对于InnoDB,DATA_LENGTH 是为聚簇索引分配的大约空间量(以字节为单位)。具体来说,它是聚簇索引大小(以页为单位)乘以InnoDB页面大小。
  • MAX_DATA_LENGTH 对于MyISAM, MAX_DATA_LENGTH是数据文件的最大长度。给定使用的数据指针大小,这是表中可以存储的数据字节总数。 未使用InnoDB。
  • INDEX_LENGTH 对于MyISAM,INDEX_LENGTH 是索引文件的长度(以字节为单位)。 对于InnoDB,INDEX_LENGTH 是为非聚簇索引分配的大约空间量(以字节为单位)。具体来说,它是非聚集索引大小(以页为单位)的总和乘以 InnoDB页面大小。
  • DATA_FREE 已分配但未使用的字节数。 InnoDB表报告表所属的表空间的可用空间。对于位于共享表空间中的表,这是共享表空间的可用空间。如果您使用多个表空间,并且表具有自己的表空间,则可用空间仅用于该表。可用空间是指完全可用范围中的字节数减去安全裕量。即使可用空间显示为0,只要不需要分配新的盘区,也可以插入行。 对于NDB群集,DATA_FREE显示磁盘上为磁盘上的磁盘数据表或碎片分配但未使用的空间。(该DATA_LENGTH列中报告了内存中数据资源的使用情况。) 对于分区表,此值仅是估计值,可能不是绝对正确。在这种情况下,获取此信息的一种更准确的方法是查询 INFORMATION_SCHEMA PARTITIONS表,如本示例所示: SELECT SUM(DATA_FREE) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ‘mydb’ AND TABLE_NAME = ‘mytable’;
  • AUTO_INCREMENT:下一个AUTO_INCREMENT值。
  • CREATE_TIME:创建表的时间。
  • UPDATE_TIME 数据文件的最后更新时间。对于某些存储引擎,此值为NULL。例如, InnoDB将多个表存储在其 系统表空间中,并且数据文件时间戳不适用。即使 文件每次表模式与每个InnoDB在单独的表 .ibd文件, 改变缓冲 可以延缓写入到数据文件,因此,文件的修改时间是从最后插入,更新或删除的时间不同。对于MyISAM,使用数据文件时间戳;但是,在Windows上,时间戳不会通过更新进行更新,因此该值不准确。 UPDATE_TIME显示last UPDATE, INSERT或 DELETE对InnoDB未分区表执行 的时间戳记值。对于MVCC,时间戳记值反映了 COMMIT时间,该时间被视为最后更新时间。重新启动服务器或从InnoDB数据字典缓存中删除表时,时间戳记不会保留。 该UPDATE_TIME列还显示了分区InnoDB表的此信息。
  • CHECK_TIME 上次检查表的时间。并非所有存储引擎这次都更新,在这种情况下,该值始终为 NULL。 对于分区InnoDB表, CHECK_TIME始终为 NULL。
  • TABLE_COLLATION:该表的默认排序规则。输出没有显式列出表的默认字符集,但是排序规则名称以字符集名称开头。
  • CHECKSUM:实时校验和值(如果有)。
  • CREATE_OPTIONS 与一起使用的额外选项CREATE TABLE。 CREATE_OPTIONS显示 partitioned表是否已分区。 CREATE_OPTIONS显示ENCRYPTION为在每个表文件表空间中创建的表指定的 子句。 在禁用严格模式的情况下创建表时 ,如果不支持指定的行格式,则使用存储引擎的默认行格式。表的实际行格式在ROW_FORMAT 列中报告。CREATE_OPTIONS显示CREATE TABLE语句中指定的行格式。 更改表的存储引擎时,不适用于新存储引擎的表选项将保留在表定义中,以便在必要时将具有其先前定义的选项的表恢复到原始存储引擎。该CREATE_OPTIONS列可能显示保留的选项。
  • TABLE_COMMENT:创建表时使用的注释(或有关MySQL为什么无法访问表信息的信息)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-07,如有侵权请联系 cloudcommunity@tencent 删除存储mysqlsql语句数据数据库
发布评论

评论列表(0)

  1. 暂无评论