MySql无法删除主键?

1、问题背景

同事咨询了一个问题,TD-SQL (for MySQL)中的某张表主键需要改为联合主键,是否必须先删除现有的主键?因为删除主键时,

提示这个错误。

1
2
3
4
5
6
7
[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.

2、问题分析

从提示上可以看到具体的原因,当设置了 sql_require_primary_key 参数,不能创建或改变一张没有主键的表。

解决方案是增加主键或者删除此参数避免错误,同时提醒了,如果表无主键,可能会导致基于行的复制产生性能问题。

/sql_require_primary_key/ 参数控制的是强制检查主键,可以动态修改。

参数释意

参数名称:sql_require_primary_key
作用范围:Global & Session
动态修改:Yes
默认值:OFF
该参数设置为 ON 时,SQL 语句 create table 创建新表或者 alter 语句时,对已存在的表进行修改,将会强制检查表中是否包含主键,如果没有主键,则会报错。

3、解决方案

方案一

既然 sql_require_primary_key 参数控制了强制检验主键,而且又是可动态修改的,临时关闭,再打开即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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 | ON |
+-------------------------+-------+
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 | OFF |
+-------------------------+-------+
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 … 合成一条语句。

1
2
3
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 的参数控制粒度很细,但通过各种应对方法,可以针对性解决特定的场景问题,

但前提还是对参数的意义,以及场景的需求能充分了解,才能找到合适的解决方案。


MySql无法删除主键?
http://example.com/2024/08/10/MySqlSummary03/
作者
JunCCore
发布于
2024年8月11日
许可协议
BY-JUNCCORE