仅当TRUNCATE表存在时(以避免错误)

时间:2014-08-19 23:19:29

标签: mysql truncate

我有一个.sql文件,在导出之前清除mysql架构中的缓存数据,因为当我将导出文件导入到其他服务器时,这些表中的缓存数据是无用的。我在多个站点上使用此脚本,但在某些情况下,某些表不存在,因为它们不是必需的。如果只存在该表,我如何只截断MySQL中的表?

TRUNCATE accesslog;
TRUNCATE cache;
TRUNCATE cache_block;
TRUNCATE cache_bootstrap;
TRUNCATE cache_customfilter;
TRUNCATE cache_field;
TRUNCATE cache_filter;
TRUNCATE cache_form;
TRUNCATE cache_image;
TRUNCATE cache_menu;
TRUNCATE cache_metatag;
TRUNCATE cache_page;
TRUNCATE cache_path;
TRUNCATE cache_token;
TRUNCATE cache_update;
TRUNCATE cache_views;
TRUNCATE cache_views_data;
TRUNCATE watchdog;

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用此存储过程,因为没有它真的很困难。

CREATE PROCEDURE tbl_delete(IN table_name CHAR(255),IN database_name CHAR(255))
BEGIN
    IF @table_name IN (SELECT table_name FROM information_schema.tables WHERE table_schema = database_name)
    THEN
        SET @query = CONCAT("TRUNCATE TABLE ", @database_name, ".", @table_name);
        PREPARE stmt FROM @query;
        EXECUTE stmt;
    END IF;
END ;

答案 1 :(得分:0)

示例表名称是 Salaries: 在 TRUNCATE 之前,您可以检查记录(从薪水中选择 *) 截断后它也会重置身份。

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Salaries')

begin

    TRUNCATE table Salaries;

end

答案 2 :(得分:-1)

See this answer on Using the IF Statement to do a conditional insert:

您可以使用ANSI INFORMATION_SCHEMA

执行相同的操作
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'accesslog')
    TRUNCATE accesslog