我有一个超过60k表的数据库,我想删除所有有1行或2行的表。
答案 0 :(得分:1)
您可以在SQL Server 2012中使用以下代码。它将删除row_count小于3的所有表。
USE [YourDB]
GO
DECLARE @Max int, @Count int,@Table_Name Varchar(20)
SET @Max =0
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp
(
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50),
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50)
)
IF OBJECT_ID('tempdb..#temp1') IS NOT NULL
DROP TABLE #temp1
CREATE TABLE #temp1
(
ID int IDENTITY(1,1),
table_name sysname ,
row_count INT
)
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
INSERT INTO #temp1
SELECT a.table_name,
a.row_count
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count
HAVING a.row_count <3
SET @Count =(SELECT COUNT(*) FROM #temp1)
WHILE @Count > @Max
BEGIN
SET @Max = @Max +1
SET @Table_Name = (SELECT table_name FROM #temp1 WHERE ID = @Max)
EXEC('DROP TABLE ' +@Table_Name)
END
答案 1 :(得分:1)
- 使用MySQL-GUI,按行数排序,删除所有1-2行的表。它就像删除Windows文件夹中的文件一样简单。这个 需要大约10秒+排序和停机时间
或
或
由于登录SO可能比解决方案1花费更多时间, 我会推荐这个解决方案。
如果您想花更多时间,以下查询将显示1-2行表的所有表名:
SELECT table_schema, table_name From information_schema.tables
WHERE table_schema='your_schema' # use your table_schema here
AND table_rows BETWEEN 1 and 2 ;
答案 2 :(得分:0)
我会在一些应用程序端逻辑中使用您选择的编程语言(提供mysql API)来完成。
获取所有表名称,描述为here,按表名对它们进行分组 例如这可能看起来像:
SELECT COUNT(table_rows), table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '{your_db}'
GROUP BY table_name;
(这不是经过测试,但是为了给你一个基本的想法...)
注意:我认为应该也可以使用SQL游标,但正如我所说,我更喜欢上述解决方案。
答案 3 :(得分:0)
你可以试试这个。 首先从数据库中获取所有表名。 获取所有表名后,将它们放在一个数组中并执行一个foreach循环,检查每个表的行数,类似这样的
$tables = array();
foreach ($tables as $table_name){
$query = "select * from '$table_name'";
$result = mysqli_query($dbCon, $query);
$num_rows = mysql_num_rows($result);
if($num_rows < 3){
$delete = "drop table $table_name";
$res_del = mysqli_query($dbCon, $delete);
echo $table_name." Deleted";
}
}
答案 4 :(得分:0)
除非您使用存储过程(参见下文),否则您可能无法使用1个SQL语句执行此操作。 您需要使用以下语句使用编程语言(例如Java with JDBC)选择MySQL中的所有表:
I, [2016-05-24T06:30:33.215786 #21746] INFO -- : Started GET "/blog/xmlrpc.php" for 89.248.174.4 at 2016-05-24 06:30:33 -0400
F, [2016-05-24T06:30:33.220309 #21746] FATAL -- :
ActionController::RoutingError (No route matches [GET] "/blog/xmlrpc.php"):
actionpack (4.2.2) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
actionpack (4.2.2) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.2) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.2) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.2) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.2) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.2) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.2) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.2) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.4) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.2) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
railties (4.2.2) lib/rails/engine.rb:518:in `call'
railties (4.2.2) lib/rails/application.rb:164:in `call'
puma (3.4.0) lib/puma/configuration.rb:224:in `call'
puma (3.4.0) lib/puma/server.rb:569:in `handle_request'
puma (3.4.0) lib/puma/server.rb:406:in `process_client'
puma (3.4.0) lib/puma/server.rb:271:in `block in run'
puma (3.4.0) lib/puma/thread_pool.rb:114:in `call'
puma (3.4.0) lib/puma/thread_pool.rb:114:in `block in spawn_thread'
然后,您可以使用编程语言中的结果为循环中的每个结果记录发出删除语句:
select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_ROWS <= 2 AND TABLE_ROWS >= 1
使用存储过程(即没有编程语言)执行此操作 请参阅此页面上的第三条评论:MySQL Reference Drop Table。 当然,您需要根据需要调整此项,因为此示例不会按行号选择表格,而是按名称选择。