仅当表存在时才截断表(以避免错误)

问题描述 投票:0回答:4

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

提前致谢。

mysql truncate
4个回答
13
投票

请参阅有关使用 IF 语句进行条件插入的答案:

您可以使用 ANSI INFORMATION_SCHEMA 执行相同的操作吗

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

3
投票

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

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

begin

    TRUNCATE table Salaries;

end

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 ;

0
投票

创建过程 CheckAndTruncateTable @DatabaseName NVARCHAR(128), @SchemaName NVARCHAR(128), @表名 NVARCHAR(128), @Action NVARCHAR(10) --“检查”或“截断” 作为 开始 不设置计数;

DECLARE @DynamicSQL NVARCHAR(MAX);
DECLARE @RecordExists BIT = 0;

-- Validate the database name, schema, and table name to prevent SQL injection
IF EXISTS (
    SELECT * 
    FROM sys.tables t
    INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
    INNER JOIN sys.databases d ON d.database_id = DB_ID(@DatabaseName)
    WHERE t.name = @TableName AND s.name = @SchemaName
)
BEGIN
    -- Construct dynamic SQL to check for record existence
    SET @DynamicSQL = N'SELECT TOP 1 @RecordExistsOut = 1 FROM [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + ']'
    EXEC sp_executesql @DynamicSQL, N'@RecordExistsOut BIT OUTPUT', @RecordExists OUTPUT

    IF @Action = 'CHECK'
    BEGIN
        IF @RecordExists = 1
            SELECT 'Record exists in the table.' AS Message
        ELSE
            SELECT 'No records found in the table.' AS Message
    END
    ELSE IF @Action = 'TRUNCATE'
    BEGIN
        -- If a record exists, truncate the table
        IF @RecordExists = 1
        BEGIN
            SET @DynamicSQL = N'TRUNCATE TABLE [' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + ']'
            EXEC sp_executesql @DynamicSQL
            SELECT 'Table truncated successfully.' AS Message
        ELSE
            SELECT 'No records found to truncate.' AS Message
        END
    END
    ELSE
    BEGIN
        SELECT 'Invalid action specified. Use ''CHECK'' or ''TRUNCATE''.' AS Message
    END
END
ELSE
BEGIN
    -- Handle invalid input
    RAISERROR('The specified database, schema, or table does not exist or the names are invalid.', 16, 1)
END

结束

© www.soinside.com 2019 - 2024. All rights reserved.