業務場景:日志數據按天分表(表名 = 固定前綴 + 日期),存儲過程需判斷當日表是否存在,不存在則創建,隨後寫入數據。本文演示 Navicat 下的實現全流程。
CONCAT('log_', DATE_FORMAT(NOW(), '%Y%m%d'))。INFORMATION_SCHEMA.TABLES)。PREPARE ... EXECUTE 動態創建表。PREPARE ... EXECUTE 寫入數據。SET @table_name = CONCAT('log_', DATE_FORMAT(NOW(), '%Y%m%d'));
SET @sql_create = CONCAT('CREATE TABLE IF NOT EXISTS ', @table_name, ' (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
biz_id VARCHAR(64),
content TEXT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4');
PREPARE stmt FROM @sql_create;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql_insert = CONCAT('INSERT INTO ', @table_name, ' (biz_id, content) VALUES (?, ?)');
PREPARE stmt FROM @sql_insert;
SET @biz_id = p_biz_id; -- 入參賦值給用戶變量
SET @content = p_content;
EXECUTE stmt USING @biz_id, @content;
DEALLOCATE PREPARE stmt;
USING @var),解決入參無法直接在動態 SQL 中引用的問題。CONCAT 拼接表名/列名/值:構建完全動態的 DDL/DML。IF NOT EXISTS:創建表時加保護,避免併發重複創建報錯。USING 綁定變量傳入,嚴禁直接拼接值字符串。CREATE TABLE 會隱式提交當前事務,若存儲過程在事務中調用需注意。CREATE、INSERT、EXECUTE 權限。動態建表是 MySQL 分表落地的經典模式,掌握 PREPARE + 用戶變量 組合拳,可應對絕大多數動態 DML/DDL 需求。