MySQL 无法修改主键?原来是因为这个参数
同事咨询了一个问题,TDSQL(for MySQL)中的某张表主键需要改为联合主键,是否必须先删除现有的主键?因为删除主键时,提示这个错误。
作者:刘晨,网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Oracle ACE(Alumni),腾讯云TVP,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,CSDN & ITPub 专家博主,公众号”bisal的个人杂货铺”,长期坚持分享技术文章,多次在线上和线下分享技术主题。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 800 字,预计阅读需要 2 分钟。
问题背景
同事咨询了一个问题,TDSQL(for MySQL)中的某张表主键需要改为联合主键,是否必须先删除现有的主键?因为删除主键时,提示这个错误。
[test]> alter table test drop primary key; ERROR 3750 (HY000): Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting.
问题分析
从提示上可以看到具体的原因,当设置了 sql_require_primary_key 参数,不能创建或改变一张没有主键的表。解决方案是增加主键或者删除此参数避免错误,同时提醒了,如果表无主键,可能会导致基于行的复制产生性能问题。
sql_require_primary_key 参数控制的是强制检查主键,可以动态修改。
参数名称:sql_require_primary_key 作用范围:Global & Session 动态修改:Yes 默认值:OFF 该参数设置为ON时,SQL语句create table创建新表或者alter语句对已存在的表进行修改,将会强制检查表中是否包含主键,如果没有主键,则会报错。
针对这个场景,是否还可以将主键改为联合主键?
创建一张测试表,主键初始是 id
。
bisal@mysqldb: [test]> create table t_primary_key (id int, c1 varchar(1), c2 varchar(1), constraint pk_t_id primary key(id)); Query OK, 0 rows affected (0.07 sec)
解决方案
方案一
既然 sql_require_primary_key 参数控制了强制检验主键,而且又是可动态修改的,临时关闭,再打开即可。
bisal@mysqldb: [test]> alter table t_primary_key drop primary key; ERROR 3750 (HY000): Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avo bisal@mysqldb: [(none)]> show variables like '%sql_require%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | sql_require_primary_key | OFF | +-------------------------+-------+ 1 row in set (0.00 sec) bisal@mysqldb: [(none)]> set sql_require_primary_key = ON; Query OK, 0 rows affected (0.02 sec) bisal@mysqldb: [(none)]> show variables like '%sql_require%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | sql_require_primary_key | ON | +-------------------------+-------+ 1 row in set (0.00 sec) bisal@mysqldb: [test]> alter table t_primary_key drop primary key; Query OK, 0 rows affected (0.10 sec) Records: 0 Duplicates: 0 Warnings: 0
但可能的风险,就是删除主键,再创建主键的这段时间内,如果有主键字段的重复数据插入,就可能导致创建新的主键不成功。另外,鉴于该参数设置成为非默认值,创建完主键,需要记得改过来。
方案二
如果 sql_require_primary_key 设置为 ON,意思就是表任何的时刻都需要有主键,不能出现真空。变更主键的操作,实际包含了删除原主键和创建新的主键两个步骤,因此只需要将两个步骤合并成一个即可。
MySQL 支持多个语句一次执行,因此只需要将 alter table ... drop primary key
和 add constraint ... primary key ...
合成一条语句。
bisal@mysqldb: [test]> alter table t_primary_key drop primary key, add constraint pk_t_01 primary key (id, c1); Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0
总结
从这个问题可以看出来,MySQL 的参数控制粒度很细,但通过各种应对方法,可以针对性解决特定的场景问题,但前提还是对参数的意义,以及场景的需求能充分了解,才能找到合适的解决方案。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
SQLE 获取

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
你和时间管理大师,就差一个开源工具「GitHub 热点速览」
在这个快节奏的生活中,我们努力地在平衡工作、生活和个人发展,但常常感到时间不够用。如何在繁忙的日程中找到一丝丝“喘息”的机会,这个名叫 cal.com 开源项目能让你更轻松地管理日程。不管每天再怎么忙也不要忘记给自己充电,这份系统设计入门教程 system-design-101,能让你利用碎片时间给自己充电,将成为架构师的事情提上日程。 众所周知,市面上的游戏引擎内核大多是采用 C/C++ 开发,云风(及其公司的小伙伴)竟然用 Lua 搞游戏引擎,一出手就是一周涨了 2k Star 的开源游戏引擎,这或许就是大师的手笔。程序员喜欢用代码将“琐碎”的事情程序化,open-interpreter 可以省去写脚本的步骤,用自然语言更好操作电脑。 这一通操作下来,空出来时间用来干点什么呢?嗯...要不打把游戏吧,刚出炉的「GitHub Game Off」最佳游戏绝对值得一玩! 本文目录 1. 开源新闻 1.1 GitHub Game Off 结果出炉 2. GitHub 热搜项目 2.1 强大的日程安排平台:cal.com 2.2 系统设计入门教程:system-design-101 2.3 ...
- 下一篇
阿里云何亚明谈多媒体未来:AI时代正翻新视频云的每一环技术
抓住已知的,迎面未知的。 编者按:大模型、降本、出海,是多媒体从业者交流的高频词,内容与交互的需求层出不穷,大模型与AI的演进目不暇接,让增速低走的视频云迎面新的机遇和挑战。作为一个跨越中美多媒体行业20年的亲历者(阿里云视频云负责人何亚明),与他的对话展现出一番场景,他没有否认多媒体生态当下的问题,但他说新的机会就在眼前,更重要的是,他对多媒体满怀希望。 策划 撰写 / LiveVideoStack、IMMENSE 从微软、Facebook到阿里云,何亚明跨越了中美两大最活跃的经济体,走过PC互联网、移动互联网到视频化的20多年,一直与多媒体为伴。 他认为,无论技术和产品如何演进,音视频作为最贴近用户的展示方式大概率不会改变,这是他对多媒体生态依然充满信心的原因之一。不过,随着大模型向AGI不断演进直至实现,多媒体从业者需要将AGI融入到多媒体技术中,甚至改变原本的工作流。比如在微软,Azure media service“退役”了,但团队并没有流失,而是进入到Copilot ,让Copilot与多媒体更好地结合。 在阿里云视频云,何亚明和团队正在探索通过大模型提高视频处理和生产的效...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6