是否存在在一次操作中截断数据库中所有表的查询(命令)?我想知道我是否可以用一个查询做到这一点。
当前回答
我们可以编写如下所示的bash脚本
truncate_tables_in_mysql() {
type mysql >/dev/null 2>&1 && echo "MySQL present." || sudo apt-get install -y mysql-client
tables=$(mysql -h 127.0.0.1 -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e "USE $BACKEND_DATABASE;
SHOW TABLES;")
tables_list=($tables)
query_string="USE $BACKEND_DATABASE; SET FOREIGN_KEY_CHECKS = 0;"
for table in "${tables_list[@]:1}"
do
query_string="$query_string TRUNCATE TABLE \`$table\`; "
done
query_string="$query_string SET FOREIGN_KEY_CHECKS = 1;"
mysql -h 127.0.0.1 -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e "$query_string"
}
你可以用你的MySQL细节替换env变量。使用一个命令就可以截断一个DB中的所有表。
其他回答
下面是一个截断本地数据库中所有表的过程。
如果它不起作用,请告诉我,我会删除这个答案。
未测试的
CREATE PROCEDURE truncate_all_tables()
BEGIN
-- Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE cmd VARCHAR(2000);
-- Declare the cursor
DECLARE cmds CURSOR
FOR
SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;
-- Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- Open the cursor
OPEN cmds;
-- Loop through all rows
REPEAT
-- Get order number
FETCH cmds INTO cmd;
-- Execute the command
PREPARE stmt FROM cmd;
EXECUTE stmt;
DROP PREPARE stmt;
-- End of loop
UNTIL done END REPEAT;
-- Close the cursor
CLOSE cmds;
END;
我不确定,但我认为有一个命令可以使用,你可以复制数据库的模式到新的数据库,一旦你这样做了,你可以删除旧的数据库,这之后,你可以再次复制数据库模式到旧的名称。
一个想法可能只是删除并重新创建表?
编辑:
@Jonathan Leffler:没错
其他建议(或者你不需要截断所有表):
为什么不创建一个基本的存储过程来截断特定的表呢
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
MS SQL Server 2005+(删除打印以实际执行…)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
如果您的数据库平台支持INFORMATION_SCHEMA视图,则获取以下查询的结果并执行它们。
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
试试MySQL:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
在Concat中添加一个分号可以使它更容易使用,例如在mysql工作台中使用。
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
do echo "Truncating table ${i}";
mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
sleep 1;
done
--
大卫,
感谢您花时间格式化代码,但这是它应该如何应用。
库尔特
在UNIX或Linux机器上:
确保您处于bash shell中。从命令行运行这些命令,如下所示。
注意:
我将凭据存储在~/.my.cnf文件中,因此不需要在命令行上提供凭据。
注意:
CPM是数据库名称
我只展示了来自每个命令的结果的一小部分示例。
找到你的外键约束:
klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
from information_schema.referential_constraints
where constraint_schema = 'cpm'
order by referenced_table_name"
Approval_external_system依赖于approval_request 地址视客户而定 Customer_identification取决于客户 External_id取决于客户 凭证取决于客户 Email_address取决于客户 Approval_request取决于客户 Customer_status取决于客户 Customer_image取决于客户
列出表和行数:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 297
2 approval_external_system 0
3 approval_request 0
4 country 189
5 credential 468
6 customer 6776
7 customer_identification 5631
8 customer_image 2
9 customer_status 13639
截断你的表:
klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
截断表地址 截断表approval_external_system 截断表approval_request 截断表国家 截断表凭据 截断表客户 截断表customer_identification 截断表customer_image 截断表customer_status
验证它是否有效:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 0
2 approval_external_system 0
3 approval_request 0
4 country 0
5 credential 0
6 customer 0
7 customer_identification 0
8 customer_image 0
9 customer_status 0
10 email_address 0
在Windows机器上:
注意:
CPM是数据库名称
C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm