【问题标题】:TRUNCATE table only if it exists (to avoid errors)仅当表存在时才 TRUNCATE 表(以避免错误)
【发布时间】:2014-10-13 04:58:42
【问题描述】:

我有一个 .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;

提前致谢。

【问题讨论】:

  • 我猜IF EXISTS TRUNCATE TABLE table_name
  • 要么 (1) 忍受错误 (2) 在任何地方创建这些表,即使在这个 .sql 中也可能(如果不存在则创建...) (3) 编写一个小应用程序,在截断之前检查.
  • @Wrikken - 很酷。我以为你很粗鲁。但我现在明白你的意思了。
  • @PreetSangha:嗯,你让我走上了一条道路,为此我感谢你。我已经对您的回答发表了评论,需要进行哪些更改才能使其真正起作用。

标签: mysql truncate


【解决方案1】:

示例表名是 Salaries: 在截断之前你可以检查记录(从工资中选择 *) 截断后它也会重置身份。

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

begin

    TRUNCATE table Salaries;

end

【讨论】:

    【解决方案2】:

    你可以试试这个存储过程,没有它真的很难。

    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 ;
    

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

      • 不要忽略 (a) 这需要在函数或过程中 (b) 你需要 THEN & END IF (c) CALL 过程和 (d) DROP 过程。
      • 如果您有第二个数据库,其中有一个名为 accesslog 的表,那么您将度过一段糟糕的时光。
      猜你喜欢
      • 2019-07-28
      • 2011-09-03
      • 2021-04-02
      • 2016-10-19
      • 2017-11-16
      • 2019-11-22
      • 2011-04-12
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多