当前位置: 首页 > wzjs >正文

秦皇岛网站建设报价关联词有哪些五年级

秦皇岛网站建设报价,关联词有哪些五年级,武汉网站优化怎么做,怎么做网页会议邀请函先说结论:生产环境建议Alter Table语句单条执行,避免组合操作 问题描述 前两天更新脚本时,发现的alter table组合操作时的问题,两种 ALTER TABLE 操作方式会导致不同的 UPDATE 行为, 验证环境的版本MySQL 8.0.34&…

先说结论:生产环境建议Alter Table语句单条执行,避免组合操作

问题描述

前两天更新脚本时,发现的alter table组合操作时的问题,两种 ALTER TABLE 操作方式会导致不同的 UPDATE 行为, 验证环境的版本MySQL 8.0.34:

操作方式一(问题现象)

-- 单条ALTER语句执行添加列和修改列位置
ALTER TABLE `parent` 
ADD COLUMN `schoolId` INT NULL AFTER `id`,
CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;-- 后续UPDATE操作会失败
UPDATE parent p
INNER JOIN student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;
   错误提示:Error Code: 2013. Lost connection to MySQL server during query

(最早添加时,schoolId 按照非空字段,调查时还跑偏引出“伪空”问题: MySql添加非空字段时的“伪空”问题 )

操作方式二(正常现象)

-- 分两条ALTER语句执行
ALTER TABLE `parent` ADD COLUMN `schoolId` INT NULL AFTER `id`;
ALTER TABLE `parent` CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;-- 后续UPDATE操作成功
UPDATE parent p
INNER JOIN student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;

问题分析

根本原因

  1. 复合ALTER操作的特殊处理

    • MySQL对单条ALTER语句中的多个修改项有特殊优化路径

    • 在8.0某些版本中,这种组合操作可能导致表元数据处于中间状态

  2. InnoDB存储引擎行为

    • 添加NULL列本应是"即时操作"(只修改元数据)

    • 但结合列位置修改会强制表重建

    • 重建过程中可能产生不一致的内部状态

  3. DDL原子性实现差异

    • 单条复合ALTER在内部可能不是真正的原子操作

    • 分步执行确保每个操作完全完成

解决方案

推荐方案(生产环境最佳实践)

-- 步骤1:仅添加列(可空)
ALTER TABLE `parent` ADD COLUMN `schoolId` INT NULL AFTER `id`;-- 步骤2:更新数据(确保所有记录有值)
UPDATE parent p
INNER JOIN student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;-- 步骤3:调整列位置(此时数据已完整)
ALTER TABLE `parent` 
CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;

方案优势

  1. 可靠性:完全避免中间状态问题

  2. 兼容性:适用于所有MySQL版本

  3. 可维护性:清晰的执行步骤便于问题排查

  4. 性能可控:每个操作都有明确的完成点

技术验证方案

复现测试脚本

-- 创建测试表
CREATE TABLE `test_parent` (`id` INT NOT NULL AUTO_INCREMENT,`studentId` INT NULL,PRIMARY KEY (`id`)
);CREATE TABLE `test_student` (`id` INT NOT NULL AUTO_INCREMENT,`schoolId` INT NULL,PRIMARY KEY (`id`)
);-- 失败案例复现
ALTER TABLE `test_parent` 
ADD COLUMN `schoolId` INT NULL AFTER `id`,
CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;UPDATE test_parent p
INNER JOIN test_student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;-- 成功案例对比
ALTER TABLE `test_parent` ADD COLUMN `schoolId` INT NULL AFTER `id`;
ALTER TABLE `test_parent` CHANGE COLUMN `studentId` `studentId` INT NULL AFTER `schoolId`;UPDATE test_parent p
INNER JOIN test_student s ON p.studentId=s.id
SET p.schoolId=s.schoolId;

各版本行为差异

MySQL 版本复合 ALTER 行为推荐方案
5.7 及以下强制表重建分步执行
8.0.12-19可能产生中间状态分步执行
8.0.20+行为改善但仍建议分步可尝试复合

生产环境建议

  1. 通用原则

    • 将结构变更与数据变更分离执行

    • 每个ALTER语句只执行一个变更目的

    • 数据填充完成后再调整列位置

  2. 大表操作建议

    # 使用专业工具处理
    pt-online-schema-change --alter "ADD COLUMN schoolId INT NULL" D=db,t=parent
     
  3. 变更检查清单

    • 执行前备份数据

    • 在测试环境验证变更脚本

    • 检查表当前状态:SHOW CREATE TABLE parent

    • 监控执行进度:SHOW PROCESSLIST

结论

通过将复合ALTER TABLE操作拆分为分步执行,可以完全避免因MySQL内部状态不一致导致的UPDATE操作失败问题。这种方案具有更好的可靠性和可维护性,建议生产环境使用分布执行。

http://www.dtcms.com/wzjs/441176.html

相关文章:

  • 中国是唯一一个拥有空间站高质量内容的重要性
  • 上海网站定制价格低网络推广项目
  • 个旧市哪里有做网站上海网站营销seo电话
  • 浙江省建设继续教育网站首页小红书seo是什么意思
  • 聊城开发区网络公司排名如何优化企业网站
  • 网站主页设计收费seo流量优化
  • 好的室内设计网站推荐网络推广和网络营销的区别
  • android 网站模板下载制作网站的软件有哪些
  • 辽宁建设工程信息网官网 a类业绩百度手机seo软件
  • 一个不懂技术的人如何做网站百度推广的方式有哪些
  • 好网站开发培训济南网站设计
  • 做外贸用什么视频网站好微信怎么做推广
  • 万网 手机网站百度客服电话24小时客服电话
  • 广西网站运营最好的公司新闻今日要闻
  • 昆明行业网站建设河北seo网络优化师
  • 如何在建设教育协会网站注册考试网站优化排名查询
  • 微信开发网站建设程序创建网站需要多少资金
  • 网站建设参考网站的说明书seo优化的主要任务
  • 海外社交网站开发类似互推商盟的推广平台
  • 外贸服装网站建设百度网盘人工申诉电话
  • 如何做优酷网站赚钱长沙seo全网营销
  • 青岛菜西有做网站的吗百度网盘登录入口
  • 建材网站做环保类型思路站长工具seo优化系统
  • 网站做301跳转在哪里打广告效果最好
  • 网站建设初级工程师市场调研的四个步骤
  • 企业做网站推广产品需要多少钱seo网站推广服务
  • 南联网站建设北京seo网站管理
  • 专业定制网站建设智能优化百度关键词指数工具
  • 群晖wordpress设为首页优化关键词方法
  • 做网站广告联盟深圳seo优化排名