在 MySQL 的开发规范中都会明确写着:MySQL InnoDB 表必须有主键,主键的选择建议:添加一个自增列作为主键,每一行的值删除后一般不会重用。但实质上, 业务开发中,还是会遇到 InnoDB 表无主键无索引的情况。
首先来看一下 MySQL InnoDB 对于主键的选择:
再来看看 MySQL 主键现在的用处:
关于 MySQL 主键,推荐阅读:https://www.percona.com/blog/2018/07/26/tuning-innodb-primary-keys/
在这里我和大家盘点一下 MySQL 为了让每个表有一个主键都做了什么事情:
set sql_generate_invisible_primary_key=ON;
CREATE TABLE `wubx_1` (
`c1` varchar(50) DEFAULT NULL,
`c2` int DEFAULT NULL
) ENGINE=InnoDB;
-- 查看表结构
CREATE TABLE `wubx_1` (
`my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
`c1` varchar(50) DEFAULT NULL,
`c2` int DEFAULT NULL,
PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
-- 插入一条数据
MySQL [wubx]> insert into wubx_1 values('datbend',1);
Query OK, 1 row affected (0.001 sec)
-- 读取数据
MySQL [wubx]> select * from wubx_1;
+---------+------+
| c1 | c2 |
+---------+------+
| datbend | 1 |
+---------+------+
1 row in set (0.000 sec)
-- 读取隐式主键
MySQL [wubx]> select my_row_id, c1, c2 from wubx_1;
+-----------+---------+------+
| my_row_id | c1 | c2 |
+-----------+---------+------+
| 1 | datbend | 1 |
+-----------+---------+------+
1 row in set (0.000 sec)
-- 使用隐式主键删除数据
MySQL [wubx]> delete from wubx_1 where my_row_id=1;
Query OK, 1 row affected (0.000 sec)
MySQL [wubx]> select * from wubx_1;
Empty set (0.000 sec)
-- 再次写入数据
MySQL [wubx]> insert into wubx_1 values('datbend',2);
Query OK, 1 row affected (0.000 sec)
-- 读取数据
MySQL [wubx]> select * from wubx_1;
+---------+------+
| c1 | c2 |
+---------+------+
| datbend | 2 |
+---------+------+
1 row in set (0.000 sec)
MySQL [wubx]> select my_row_id, c1,c2 from wubx_1;
+-----------+---------+------+
| my_row_id | c1 | c2 |
+-----------+---------+------+
| 2 | datbend | 2 |
+-----------+---------+------+
1 row in set (0.000 sec)
这里面有一些限制
对于 GIPK 隐式主键的使用场景:
对于一些业务确实没有声明主键,现在就不用改业务,直接创建一个隐式主键就 Ok 了。
可以说到这里 MySQL 也是给主键这个事情操碎了心。如果大家以后不要在 MySQL 主键这个事情上掉坑里了。
有了 GIPK 我也不怕传统业务开发中的无主键的表了 :)
本文分享自 MySQLBeginner 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!