mysql主键自增策略(MySQL的主键命名策略相关)
mysql主键自增策略
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的主键命名策略相关的详细内容,更多关于MySQL 主键命名策略的资料请关注开心学习网其它相关文章!
原文链接:https://cloud.tencent.com/developer/article/1545560
- binlog怎么恢复mysql数据库(mysql5.7使用binlog 恢复数据的方法)
- 了解mysql数据自动备份(MySQL数据备份方法的选择与思考)
- MySQL中对varchar类型的排序
- 如何查找MySQL中查询慢的SQL语句
- mysql统计下个月过生日的人数(Mysql出生日期转换为年龄并分组统计人数的方法示例)
- mysqlworkbench怎么设置连接(详解MySQL Workbench使用教程)
- 如何在cmd里开启mysql(Windows下通过cmd进入DOS窗口访问MySQL数据库)
- 怎么运行xampp中的mysql(本地安装了mysql导致xampp的mysql服务启动失败)
- centos7离线安装mysql5.7(CentOS7.5 安装MySql的教程)
- mysql有哪些约束(MySQL完整性约束的定义与实例教程)
- mysql的简单介绍(MySQL Shell的介绍以及安装)
- docker中mysql连接命令(docker 如何修改mysql的root密码)
- Mysql中CONCAT、CONCAT_WS字符串拼接函数
- mysql server安装图解教程(mysql容器之间的replication配置实例详解)
- centos安装mysql8.0教程(Centos7 安装 Mysql8教程)
- mysql根据子节点查询父节点(mysql 递归查找菜单节点的所有子节点的方法)
- 华为 联想等46家公司笔试面试题,涉及各行各业,建议收藏(联想等46家公司笔试面试题)
- ()
- ()
- 800壮士拼死拖住30万日军 八佰 的真实历史,誓与阵地共存亡(800壮士拼死拖住30万日军)
- 演员陈创,火于 哮天犬 ,颠峰于 福贵 ,现状却令人唏嘘(演员陈创火于哮天犬)
- 幼小衔接-20以内看图读数 写数 数的组成练习题(幼小衔接-20以内看图读数)
热门推荐
- html转ppt(HTML里显示pdf、word、xls、ppt的方法示例)
- sqlserver如何添加数据库(sqlserver建立新用户及关联数据库教程)
- nginx tomcat docker 负载均衡(Nginx+Tomcat实现负载均衡、动静分离的原理解析)
- volume怎么添加docker(docker volume删除卷的操作)
- python random函数在哪个包(Python3.5内置模块之random模块用法实例分析)
- python电脑端微信自动化(python使用wxpy实现微信消息防撤回脚本)
- mysql生成唯一订单号(MySQL高并发生成唯一订单号的方法实现)
- php生成安全随机数(PHP随机数函数rand与mt_rand的讲解)
- 如何提升代码质量
- docker获取自己的容器id(docker 如何添加证书)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9