IT袋

当前位置:主页 > 经验教程 > 建站编程 >

MySQL无法修改主键是什么原因

MySQL无法修改主键是什么原因

时间:2024-01-23 18:47:54 来源:IT袋 作者:马勇
导读:MySQL无法修改主键是什么原因,本文为你详解MySQL无法修改主键是什么原因的相关知识,接下来就是全面介绍。 1、问题背景 同事咨询了一个问题,TDSQL(for MySQL)中的某张表主键需要改为联合主键,是

MySQL无法修改主键是什么原因

本文为你详解MySQL无法修改主键是什么原因的相关知识,接下来就是全面介绍。

1、问题背景

同事咨询了一个问题,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.

MySQL无法修改主键是什么原因

2、问题分析

从提示上可以看到具体的原因,当设置了 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)

3、解决方案

方案一

既然 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

相关阅读

  • 掌握核心知识点:深度解析消息队列面试题及答案

    掌握核心知识点:深度解析消息队列面试题及答案

    为大家说一说掌握核心知识点的话题,下面为详细的介绍。 消息队列(Message Queue)是一种应用程序对应用程序的通信方法。 在微服务架构、异步处理、缓解系统压力等场景下,消息队列发挥

  • 掌握Redis数据库操作:redis-cli命令详解及实践应用

    掌握Redis数据库操作:redis-cli命令详解及实践应用

    如果想了解掌握Redis数据库操作IT技巧方面的经验,一定能解决您的问题的,一起来了解吧! Redis是一种开源的、在内存中存储数据的数据库,以其高性能和灵活的数据结构而受到欢迎。 在本篇

  • swiper是什么插件 有什么用?

    swiper是什么插件 有什么用?

    Swiper常用于移动端网站的内容触摸滑动 Swiper是纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端。 Swiper能实现触屏焦点图、触屏Tab切换、触屏轮播图切换等常用效果。 Swiper开源

  • Redis的过期策略都有哪些?

    Redis的过期策略都有哪些?

    今天为网友们详解Redis的过期策略都有哪些的IT知识,相关内容具体如下: 思考:假如redis的key过期之后,会立即删除吗? Redis对数据设置数据的有效时间,数据过期以后,就需要将数据从内存中