MySQL的主键命名策略相关
知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《MySQL的主键命名策略相关》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!
最近在梳理数据生命周期管理的细节时,发现了一个小问题,那就是MySQL的主键命名策略,似乎会忽略任何形式的自定义命名。
也就意味着你给主键命名为idx_pk_id这种形式,在MySQL里面会统一按照PRIMARY来处理。
当然我们可以在这个基础之上做一些拓展和补充。
首先来复现下问题,我们连接到数据库test,然后创建表test_data2.
mysql> use test mysql> create table test_data2 (id int ,name varchar(30)); Query OK, 0 rows affected (0.05 sec)
接着创建一个主键,命名为idx_pk_id,从执行情况来看,MySQL是正常处理了。
mysql> alter table test_data2 add primary key idx_pk_id(id); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
为了进一步对比,我们添加一个唯一性索引(辅助索引),来看看它们的差异。
mysql> alter table test_data2 add unique key idx_uniq_name(name); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
查看主键命名方法1:使用show indexes命令
要查看MySQL索引的信息,使用show indexes from test_data2就可以。
mysql> show indexes from test_data2\G
*************************** 1. row ***************************
Table: test_data2
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: test_data2
Non_unique: 0
Key_name: idx_uniq_name
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
查看主键命名方法2:使用数据字典information_schema.statistics
使用命令的方式不够通用,我们可以使用数据字典information_schema.statistics来进行数据提取。
mysql> select *from information_schema.statistics where table_schema='test' and table_name='test_data2' limit 20 \G
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: test_data2
NON_UNIQUE: 0
INDEX_SCHEMA: test
INDEX_NAME: PRIMARY
SEQ_IN_INDEX: 1
COLUMN_NAME: id
COLLATION: A
CARDINALITY: 0
SUB_PART: NULL
PACKED: NULL
NULLABLE:
INDEX_TYPE: BTREE
COMMENT:
INDEX_COMMENT:
*************************** 2. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: test_data2
NON_UNIQUE: 0
INDEX_SCHEMA: test
INDEX_NAME: idx_uniq_name
SEQ_IN_INDEX: 1
COLUMN_NAME: name
COLLATION: A
CARDINALITY: 0
SUB_PART: NULL
PACKED: NULL
NULLABLE: YES
INDEX_TYPE: BTREE
COMMENT:
INDEX_COMMENT:
2 rows in set (0.00 sec)
查看主键命名方法3:使用show create table 命令
如果查看建表语句,会发现主键名已经被过滤掉了。
mysql> show create table test_data2\G
*************************** 1. row ***************************
Table: test_data2
Create Table: CREATE TABLE `test_data2` (
`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_uniq_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
有的同学可能想,是不是分别执行了create,alter语句导致处理方式有差异,我们可以一步到位,在create语句里面声明主键名。
CREATE TABLE `test_data3` (
`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY idx_pk_id(`id`),
UNIQUE KEY `idx_uniq_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这个时候查看建表语句,会发现结果和上面一样,主键名都是PRIMARY.
mysql> show create table test_data3\G
*************************** 1. row ***************************
Table: test_data3
Create Table: CREATE TABLE `test_data3` (
`id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_uniq_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
查看主键命名方法4:查看约束命名
当然还有多种验证方式,比如我们使用约束的方式来命名,得到的主键名都是PRIMARY.
CREATE TABLE IF NOT EXISTS `default_test` ( `default_test`.`id` SMALLINT NOT NULL AUTO_INCREMENT, `default_test`.`name` LONGTEXT NOT NULL, CONSTRAINT `pk_id` PRIMARY KEY (`id`) );
查看主键命名方法5:使用DML报错信息
当然还有其他多种形式可以验证,比如我们使用DML语句。
mysql> insert into test_data2 values(1,'aa'); Query OK, 1 row affected (0.02 sec) mysql> insert into test_data2 values(1,'aa'); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
以上的方法都可以让我们对这个细节有更深入的理解,当然我们可以再深入一些。
查看主键命名方法6:官方文档
官方文档里面其实包含了这个信息,但是不是很明显。
关于主键的描述,大体内容如下,有一条是专门做了声明,主键名为PRIMARY.
- 一个表只能有一个PRIMARY KEY。
- PRIMARY KEY的名称始终为PRIMARY,因此不能用作任何其他类型的索引的名称。
- 如果您没有PRIMARY KEY,而应用程序要求您在表中提供PRIMARY KEY,则MySQL将返回没有NULL列的第一个UNIQUE索引作为PRIMARY KEY。
- 在InnoDB表中,将PRIMARY KEY保持较短,以最小化辅助索引的存储开销。每个辅助索引条目都包含对应行的主键列的副本。
- 在创建的表中,首先放置一个PRIMARY KEY,然后放置所有UNIQUE索引,然后放置非唯一索引,这有助于MySQL优化器确定使用哪个索引的优先级,还可以更快地检测重复的UNIQUE键。
查看主键命名方法7:源代码
在sql_table.cc 里面对主键名称做了定义声明。
const char *primary_key_name="PRIMARY";
顺着这条路,可以看到在不同层的实现中的一些逻辑情况。

小结:
通过这样的一些方式,我们对主键的命名情况有了一个整体的认识,为什么会采用PRIMARY这样一个命名呢,我总结了几点:
1)统一命名可以理解是一种规范
2)和唯一性索引能够区别开来,比如一个唯一性索引非空,从属性上来看很相似的,通过主键命名就可以区分出来,在一些特性和索引使用场景中也容易区分。
3)主键是一个表索引的第一个位置,统一命名可以在逻辑判断中更加清晰,包括字段升级为主键的场景等等。
4)在优化器处理中也会更加方便,提高MySQL优化器确定使用哪个索引的优先级。
终于介绍完啦!小伙伴们,这篇关于《MySQL的主键命名策略相关》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布数据库相关知识,快来关注吧!
如何在mysql进行查询缓存及失败的解决方法
- 上一篇
- 如何在mysql进行查询缓存及失败的解决方法
- 下一篇
- MySQL 一则慢日志监控误报的问题分析与解决
-
- 酷炫的魔镜
- 这篇文章出现的刚刚好,太细致了,赞 ??,收藏了,关注作者了!希望作者能多写数据库相关的文章。
- 2023-02-21 00:58:27
-
- 时尚的仙人掌
- 这篇博文真及时,作者大大加油!
- 2023-02-17 09:22:22
-
- 沉静的睫毛
- 很详细,码住,感谢楼主的这篇博文,我会继续支持!
- 2023-02-13 05:08:02
-
- 怕孤独的薯片
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢楼主分享文章内容!
- 2023-01-24 08:18:35
-
- 健壮的电话
- 这篇博文太及时了,很详细,赞 ??,码住,关注楼主了!希望楼主能多写数据库相关的文章。
- 2022-12-31 10:59:49
-
- 激动的乐曲
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢楼主分享文章!
- 2022-12-30 21:02:46
-
- 疯狂的百褶裙
- 太细致了,收藏了,感谢作者大大的这篇技术文章,我会继续支持!
- 2022-12-29 12:14:34
-
- 数据库 · MySQL | 1星期前 | MySQL · 慢查询 · 索引优化 · COUNT查询 · 汇总表 · 联合索引 覆盖索引 汇总表 MySQL COUNT慢 COUNT(*)优化
- MySQL COUNT(*) 总数查询变慢怎么办:从扫描行数到汇总表的完整治理流程
- 329浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 2086次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 1941次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 1876次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 2086次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 2068次使用
-
- Mysql主键和唯一键的区别点总结
- 2022-12-30 248浏览

