我有一个 .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;
提前致谢。
您可以使用 ANSI INFORMATION_SCHEMA 执行相同的操作吗
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'accesslog')
TRUNCATE accesslog
示例表名称是 Salaries: 在 TRUNCATE 之前您可以检查记录(从薪资中选择 *) 截断后它也会重置身份。
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Salaries')
begin
TRUNCATE table Salaries;
end
您可以尝试这个存储过程,因为没有它真的很难。
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 ;
创建过程 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
结束