MySQL无法修改主键的问题分析及解决方案

 更新时间:2024年01月23日 10:21:59   作者:爱可生开源社区  
最近同事咨询了一个问题,TDSQL(for MySQL)中的某张表主键需要改为联合主键,是否必须先删除现有的主键?因为删除主键时,提示这个错误,所以本文给大家介绍了MySQL无法修改主键的问题分析及解决方案,需要的朋友可以参考下

问题背景

同事咨询了一个问题,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 keyadd 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 的参数控制粒度很细,但通过各种应对方法,可以针对性解决特定的场景问题,但前提还是对参数的意义,以及场景的需求能充分了解,才能找到合适的解决方案。

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

以上就是MySQL无法修改主键的问题分析及解决方案的详细内容,更多关于MySQL无法修改主键的资料请关注脚本之家其它相关文章!

相关文章

  • mysql获取字符串长度函数(CHAR_LENGTH)

    mysql获取字符串长度函数(CHAR_LENGTH)

    本文介绍一下关于mysql获取字符串长度的方法,希望此教程对各位同学会有所帮助哦。
    2013-11-11
  • MySQL分区表管理命令汇总

    MySQL分区表管理命令汇总

    这篇文章主要分享了MySQL分区表管理命令汇总,分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁灭性的的结果,下面我们就来看看分区表那些常用的管理命令,需要的朋友可以参考下
    2022-03-03
  • MYSQL 高级文本查询之regexp_like和REGEXP详解

    MYSQL 高级文本查询之regexp_like和REGEXP详解

    在MySQL中,regexp_like和REGEXP都是用于执行正则表达式搜索的函数,这篇文章主要介绍了MYSQL 高级文本查询之regexp_like和REGEXP,需要的朋友可以参考下
    2023-05-05
  • 深度分析mysql GROUP BY 与 ORDER BY

    深度分析mysql GROUP BY 与 ORDER BY

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQLiteDatabase 的 rawQuery,直接运行sql语句就可以了。
    2014-06-06
  • mysql 5.7.11 winx64安装配置教程

    mysql 5.7.11 winx64安装配置教程

    这篇文章主要介绍了mysql 5.7.11 winx64安装配置教程,介绍了MySQL5.7安装及初始化,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Mysql中的超时时间设置方式

    Mysql中的超时时间设置方式

    这篇文章主要介绍了Mysql中的超时时间设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • mysql查询结果实现多列拼接查询

    mysql查询结果实现多列拼接查询

    本文主要介绍了mysql查询结果实现多列拼接查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • mysql source 命令导入大的sql文件的方法

    mysql source 命令导入大的sql文件的方法

    本文将详细介绍mysql source 命令导入大的sql文件的方法;需要的朋友可以参考下
    2012-11-11
  • MySQL数据库约束操作示例讲解

    MySQL数据库约束操作示例讲解

    约束是用来限制表中的数据长什么样子的,即什么样的数据可以插入到表中,什么样的数据插入不到表中,下面这篇文章主要给大家介绍了关于如何通过一文理解MySQL数据库的约束与表的设计的相关资料,需要的朋友可以参考下
    2022-11-11
  • MySQL主从复制原理以及需要注意的地方

    MySQL主从复制原理以及需要注意的地方

    这篇文章主要介绍了MySQL主从复制原理以及需要注意的地方,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11

最新评论