MySQL触发器实现简单的分表逻辑_垂直分表与自动化路由

张开发
2026/4/11 6:45:16 15 分钟阅读

分享文章

MySQL触发器实现简单的分表逻辑_垂直分表与自动化路由
MySQL触发器中禁止使用PREPARE/EXECUTE动态建表因引擎限制而非权限问题须预建分表、显式字段插入、合理选用BEFORE/AFTER时机并控制路由逻辑与索引以保障性能与数据一致性。触发器里不能用 PREPARE / EXECUTE 动态建表MySQL 触发器执行时处于语句上下文锁定状态不支持动态 SQL。想在 INSERT 触发器里根据时间自动创建新分表比如 t_log_202410会直接报错ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger。这不是权限问题是引擎限制。实操建议分表动作必须提前完成——上线前按业务周期如月/周预建好未来 6–12 个月的表命名统一如 t_log_202410、t_log_202411触发器只做路由判断和 INSERT 转发不参与建表用外部脚本Python/Shell定期检查并补全缺失分表配合 cron 执行别塞进触发器INSERT ... SELECT 路由到目标分表时字段顺序必须严格一致垂直分表后主表和子表字段不完全重叠但触发器里用 INSERT INTO t_log_202410 (...) SELECT ... 转发时若字段名、数量、顺序稍有出入就会静默丢数据或报错 Column count doesnt match value count。常见错误现象主表加了新字段但没同步到所有分表结构触发器 INSERT 失败SELECT 子句漏写某个非空字段导致插入失败尤其 NOT NULL 字段用了 * —— 绝对禁止字段顺序不可控且不同分表结构可能已分化实操建议触发器中显式列出所有目标字段INSERT INTO t_log_202410 (id, uid, content, created_at) SELECT NEW.id, NEW.uid, NEW.content, NEW.created_at所有分表用相同 DDL 初始化后续字段变更必须原子化同步用 pt-online-schema-change 或带锁升级用视图或存储过程封装 INSERT 逻辑不行——触发器里不能调用含 SQL 的存储过程NEW 和 OLD 在 BEFORE/AFTER 触发器中的可用性差异垂直分表常需在插入前生成 ID 或补全字段比如把 created_at 设为 NOW()这时必须用 BEFORE INSERT若想基于刚插入的主键再写日志则得用 AFTER INSERT。但两者能访问的记录状态完全不同。关键区别 知网AI智能写作 知网AI智能写作写文档、写报告如此简单

更多文章