MySQL 8.0 新特性之不可见主键
数据库设计通常需要满足一定的范式要求,其中主键更是最基本的要求。不过,数据库管理系统却允许我们创建没有主键的表。这样的表在 MySQL 中会带来查询性能低下、复制延迟甚至无法实现高可用配置等问题。
为此,MySQL 8.0.30 版本引入了一个新的功能,叫做不可见主键(Generated Invisible Primary Keys),它可以自动为没有显式指定主键的 InnoDB 表创建一个不可见的主键。
不可见主键
MySQL 通过系统变量 sql_generate_invisible_primary_key 控制是否启用 GIPK 特性,该变量的默认设置为 OFF。
以下示例创建了两个表,都没有指定主键。
mysql> SELECT @@sql_generate_invisible_primary_key;
+--------------------------------------+
| @@sql_generate_invisible_primary_key |
+--------------------------------------+
| 0 |
+--------------------------------------+
1 row in set (0.00 sec)mysql> CREATE TABLE auto_0 (c1 VARCHAR(50), c2 INT);
Query OK, 0 rows affected (0.02 sec)mysql> SET sql_generate_invisible_primary_key=ON;
Query OK, 0 rows affected (0.00 sec)mysql> SELECT @@sql_generate_invisible_primary_key;
+--------------------------------------+
| @@sql_generate_invisible_primary_key |
+--------------------------------------+
| 1 |
+--------------------------------------+
1 row in set (0.00 sec)mysql> CREATE TABLE auto_1 (c1 VARCHAR(50), c2 INT);
Query OK, 0 rows affected (0.04 sec)
创建 auto_0 表时,sql_generate_invisible_primary_key 设置为 OFF;创建 auto_1 表时,sql_generate_invisible_primary_key 设置为 ON。
使用 SHOW CREATE TABLE 语句查看两个表的区别:
mysql> SHOW CREATE TABLE auto_0\G
*************************** 1. row ***************************Table: auto_0
Create Table: CREATE TABLE `auto_0` (`c1` varchar(50) DEFAULT NULL,`c2` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)mysql> SHOW CREATE TABLE auto_1\G
*************************** 1. row ***************************Table: auto_1
Create Table: CREATE TABLE `auto_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
1 row in set (0.00 sec)
MySQL 自动为 auto_1 创建了一个不可见字段 my_row_id,并且将其设置为主键。
不可见字段也叫做隐藏字段,是 MySQL 8.0.23 版本增加的新功能。作为不可见字段,my_row_id 不会出现在 SELECT * 或者 TABLE 语句的结果中,查询该字段必须显式指定它的名字。
这种情况下,系统默认增加的不可见主键字段名称固定为 my_row_id,因此我们不能在创建表时指定其他字段名为 my_row_id,除非同时将其指定为主键。
修改属性
当我们启用了 GIPK 功能时,不可见主键 my_row_id 不能使用 ALTER TABLE 语句进行修改,只能设置它的可见属性。以下命令将 auto_1 表的不可见主键设置为可见字段:
mysql> ALTER TABLE auto_1 ALTER COLUMN my_row_id SET VISIBLE;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> SHOW CREATE TABLE auto_1\G
*************************** 1. row ***************************Table: auto_1
Create Table: CREATE TABLE `auto_1` (`my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT,`c1` varchar(50) DEFAULT NULL,`c2` int DEFAULT NULL,PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)
当我们启用了 GIPK 功能时,如果删除不可见主键会导致以下任意情况发生,都不允许删除不可见主键:
- 该表没有主键;
- 删除主键而保留主键字段。
另外,GIPK 功能只支持 InnoDB 存储引擎,当我们使用 ALTER TABLE 语句修改这种表的存储引擎时,仍然会保留字段和主键约束,但是它会变成普通的主键字段。
字典信息
默认情况下,SHOW CREATE TABLE、SHOW COLUMNS 以及 SHOW INDEX 命令都会显示不可见主键信息。同时,information_schema 数据库中的 COLUMNS 和 STATISTICS 表中也包含了不可见主键字段。这一行为可以通过系统变量 show_gipk_in_create_table_and_information_schema 进行控制,默认值为 ON。
mysql> SELECT @@show_gipk_in_create_table_and_information_schema;
+----------------------------------------------------+
| @@show_gipk_in_create_table_and_information_schema |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
1 row in set (0.00 sec)
此时,我们查询系统表 COLUMNS 可以返回 auto_1 中的不可见主键 my_row_id:
mysql> SELECT COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, COLUMN_KEY-> FROM INFORMATION_SCHEMA.COLUMNS-> WHERE TABLE_NAME = "auto_1";
+-------------+------------------+-----------+------------+
| COLUMN_NAME | ORDINAL_POSITION | DATA_TYPE | COLUMN_KEY |
+-------------+------------------+-----------+------------+
| my_row_id | 1 | bigint | PRI |
| c1 | 2 | varchar | |
| c2 | 3 | int | |
+-------------+------------------+-----------+------------+
3 rows in set (0.01 sec)
如果将系统变量 show_gipk_in_create_table_and_information_schema 设置为 OFF,再次查询系统表 COLUMNS,不会显示不可见主键字段:
mysql> SET show_gipk_in_create_table_and_information_schema = OFF;
Query OK, 0 rows affected (0.00 sec)mysql> SELECT @@show_gipk_in_create_table_and_information_schema;
+----------------------------------------------------+
| @@show_gipk_in_create_table_and_information_schema |
+----------------------------------------------------+
| 0 |
+----------------------------------------------------+
1 row in set (0.00 sec)mysql> SELECT COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, COLUMN_KEY-> FROM INFORMATION_SCHEMA.COLUMNS-> WHERE TABLE_NAME = "auto_1";
+-------------+------------------+-----------+------------+
| COLUMN_NAME | ORDINAL_POSITION | DATA_TYPE | COLUMN_KEY |
+-------------+------------------+-----------+------------+
| c1 | 2 | varchar | |
| c2 | 3 | int | |
+-------------+------------------+-----------+------------+
2 rows in set (0.00 sec)
复制与备份
系统变量 sql_generate_invisible_primary_key 的配置不会被复制,复制应用线程会忽略该变量。这就意味着源节点的设置不会对副本产生影响。从 MySQL 8.0.32 版本开始,我们可以在 CHANGE REPLICATION SOURCE TO 语句使用 REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE 选项设置副本节点启用 GIPK 功能,为指定复制渠道中的那些没有主键的表自动增加不可见主键。
对于 CREATE TABLE … SELECT 语句,GIPK 支持基于行的复制选项,此时二进制日志中包含了 GIPK 定义,可以正确地复制。如果是基于语句的复制,CREATE TABLE … SELECT 不支持 sql_generate_invisible_primary_key = ON。
如果启用了 GIPK 功能,使用 mysqldump 备份或者还原数据时,可以通过 --skip-generated-invisible-primary-key 选项排除 GIPK 信息。
相关文章:
MySQL 8.0 新特性之不可见主键
数据库设计通常需要满足一定的范式要求,其中主键更是最基本的要求。不过,数据库管理系统却允许我们创建没有主键的表。这样的表在 MySQL 中会带来查询性能低下、复制延迟甚至无法实现高可用配置等问题。 为此,MySQL 8.0.30 版本引入了一个新…...
kubernetes-networkpolicies网络策略问题
kubernetes-networkpolicies网络策略问题 问题描述 重点重点重点,查看我的博客CKA考题,里面能找到解决方法 1.部署prometheus监控的时候,都部署成功,但是web访问503-504超时 2.添加ingress的时候也是访问不到,其他命…...
wps没保存关闭了恢复数据教程
有时候我们因为电脑问题会忘记保存就关闭wps导致数据丢失,不知道wps没保存关闭了怎么恢复数据,其实数据是无法恢复的。 wps没保存关闭了怎么恢复数据 1、wps没有数据恢复功能,不过可以开启自动备份。 2、我们可以先点击wps左上角的“文件”…...
Android9.0以后不允许HTTP访问的解决方案
背景 自 Android 9.0 起,默认禁止使用 HTTP 进行访问。当尝试使用 HTTP 链接时,将会收到以下错误信息: "Cleartext HTTP traffic to " host " not permitted"为了解决这一问题,下面介绍两种破解方法&…...
nvm安装以后,node -v npm 等命令提示不是内部或外部命令
因为有vue2和vue3项目多种,所以为了适应各类版本node,使用nvm管理多种node版本,但是当我按教程安装nvm以后,nvm安装以后,node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址:https://github.com/coreybutler/…...
SBA架构5G核心网
SBA(Service Based Architecture)架构是一种面向服务的架构,旨在提供更灵活、更可扩展、更容易部署和管理的解决方案。在电信领域,SBA架构被广泛应用于5G核心网和下一代网络的设计中。 在卫星互联网核心网的总体技术要求中&#…...
上位机图像处理和嵌入式模块部署(qmacvisual图像拼接)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 qmacvisual本身提供了图像拼接的功能。功能本身比较有意思的。大家如果拍过毕业照,特别是那种几百人、上千人的合照,应该就…...
关于对postcss安装和使用比较详细
PostCSS是一款强大的CSS工具,它可以自动解析CSS代码,应用一系列的插件,然后输出转换后的CSS。PostCSS本身是一个功能相对简单的工具,但它的强大之处在于其插件生态系统,这些插件提供了各种各样的功能,如自动…...
uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度
上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…...
使用itext-core生成PDF
1、添加引用依赖包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.3</version><type>pom</type></dependency> 2、上代码 package com.student.demo.pdf;impor…...
接口自动化框架搭建(四):pytest的使用
1,使用说明 网上资料比较多,我这边就简单写下 1,目录结构 2,test_1.py创建两条测试用例 def test_1():print(test1)def test_2():print(test2)3,在pycharm中执行 4,执行结果: 2࿰…...
蓝桥杯算法基础(34)深度优先搜索DFS(数独游戏)(部分和)(水洼数目)(八皇后问题)(素数环)(困难的串)
深度优先搜索DFS Depth First Searchdfs:先把一条路走到黑 纵横bfs:所有路口看一遍 图 必须借助队列的数据结构无死角搜索数独游戏 你一定听说过数独游戏 如下图所示,玩家需要根据9*9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行…...
蓝桥杯备考随手记: Math 类中常用方法
Java的Math类是一个包含数学操作方法的实用工具类。它提供了许多用于执行各种数学计算的静态方法。 下面是Math类中一些常用的方法: abs():返回参数的绝对值。 int absoluteValue Math.abs(-10); System.out.println(absoluteValue); // Output: 10 c…...
外包干了4年,技术退步明显。。。。
说一下自己的情况,本科生,19年通过校招进入上海某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&a…...
亚远景科技-Hardware Engineering SPICE课程大纲
Hardware SPICE是intacs为电子硬件开发创建的PRM/PAM过程参考和评估模型,其符合ISO/IEC15504-2, Automotive SPICE 4.0, ISO 26262-1和5: 2018等标准。 无论您是想要深入了解硬件工程领域,还是希望成长为Provisional初级、Competent主任和Principal首席硬…...
JDK8的下载安装与环境变量配置教程
前言 官网下载:Java Archive Downloads - Java SE 8u211 and later 现在应该没人用32位的系统了吧,直接下载Windows x64 Installer jdk-8u391-windows-x64.exe 一、安装JDK 1. 打开jdk-8u391-windows-x64.exe 2. 直接下一步 3. 这个地方不要动他&…...
深入探讨分布式ID生成方案
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…...
花钱的艺术:消费和投资如何分配
消费是钱花出去就回不来了。 消费分为可选消费和必需消费。 必需消费是必须花的钱,用一句老话,财米油盐酱醋茶,维持生活必需的支出。 可选消费,用来提升生活水平的支出,可花可不花,比如苹果手机…...
git 代码库查看方法
在Git中,你可以使用多种命令来查看代码库(repository)的内容。以下是一些常用的命令: 查看所有分支: git branch这个命令会列出本地仓库中的所有分支。当前活动的分支前面会有一个星号(*)。 查…...
MySql的下载与安装
window系统: 下载MySQL 8.0 访问MySQL官方网站: 打开浏览器,输入网址 https://dev.mysql.com/downloads/mysql/ 进入MySQL下载页面。 选择版本: 在网页中找到“MySQL Community Server”部分,这通常是最新的社区版&am…...
python学习17:python中的while循环
python中的while循环 1.循环的作用就是:重复运行某些代码 2.while循环: 1.while的条件必须是布尔类型的 True表示继续循环,False表示结束循环 2.必须设置循环结束条件,否则将会无限循环 ,如下的count<10 如果coun…...
Android中的导航navigation的使用
Android中的导航(Navigation)是一种应用程序设计模式,它通过使用统一的用户界面来管理应用程序中的各种界面和交互。在Android中,导航主要通过使用Navigation SDK来实现,该SDK提供了一组工具和组件,可以帮助…...
Clip算法解读
论文地址:https://arxiv.org/pdf/2103.00020.pdf 代码地址:https://github.com/OpenAI/CLIPz 中文clip代码:https://gitcode.com/OFA-Sys/Chinese-CLIP/overview 一、动机 主要解决的问题: 超大规模的文本集合训练出的 NLP 模…...
使用第三方远程连接工具ssh连接vagrant创建的虚拟机
vagrant默认密码都是vagrant 密码认证默认是关闭的,进入虚拟机,打开密码认证 1、使用命令vi /etc/ssh/sshd_config进入配置,注意要切换到root用户,这个配置root有权限 2、找到PasswordAuthentication默认为no,改为yes 3、重启虚…...
linux查找指定目录下包含指定字符串文件,包含子目录
linux查找指定目录下包含指定字符串的文件,包含子目录 linux查找指定目录下包含指定字符串的指定文件格式,包含子目录 指定目录 cd /home/www/linux查找指定目录下包含指定字符串的文件,包含子目录 grep -r "指定字符串"注释 gr…...
27. BI - PageRank 的那些相关算法 - PersonRank, TextRank, EdgeRank
本文为 「茶桁的 AI 秘籍 - BI 篇 第 27 篇」 Hi, 我是茶桁. 之前咱们用两节课的时间来讲了 PageRank, 包括它的起源, 公式以及工具. 并在一个希拉里邮件的案例中用networkx完成了练习. 在上一节课中, 咱们不仅做了案例, 并且说到了 PageRank 模型的影响力, 并且讲了其中一个…...
[数据集][目标检测]公共场所危险物品检测数据集VOC+YOLO格式1431张6类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1431 标注数量(xml文件个数):1431 标注数量(txt文件个数):1431 标注…...
创业项目开发(持续更新)
最近项目梳理: 一、业务目标 最重要的业务目标就是要能实现自己做事情赚钱。所以有两个维度,第一个维度就是最重要的就是自己做事情。第二个维度才是赚钱。 如果要自己做事情,需要什么样的事情,这个事情的目标是什么࿰…...
基于SpringBoot的“校园台球厅人员与设备管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“校园台球厅人员与设备管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图…...
【Java数据结构】关于栈的操作出栈,压栈,中缀表达式,后缀表达式,逆波兰表达式详解
🔥个人主页:努力学编程’ 🔥内容管理:java数据结构 上一篇文章我们讲过了java数据结构的链表,对于链表我们使用了它的一些基本操作,完成了扑克牌小游戏的操作,如果你感兴趣的话,点…...
微软 开源 wordpress/网络运营培训
基于PyQt5 Python3.7 OpenCV实现的人脸识别身份认证系统,附源码。 技术选型 PyQt5 Python3.7 OpenCV 功能概述 实现人员注册,信息修改,人脸识别获取相关信息 人员信息通过序列化存储在datafile.txt文件中 haarcascade_frontalface_default.xml是OpenCV中自…...
前端微信小程序开发/东莞营销网站建设优化
git 本地库推送远程库 版本冲突的解决方法参考文章: (1)git 本地库推送远程库 版本冲突的解决方法 (2)https://www.cnblogs.com/ylemzhang/p/4326572.html 备忘一下。...
手机app微信网站/广告公司推广平台
2019独角兽企业重金招聘Python工程师标准>>> //61.找出数组中两个只出现一次的数字(数组) //题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。 //请写程序找出这两个只出现一次的数字。要求时间复杂度是…...
怎么向国外打广告/seo客服
这年代,做数据的,没人不知道 Spark 是什么吧。作为最火的大数据计算引擎,现在基本上是各互联网大厂的标配了。比如,字节跳动基于 Spark 构建的数据仓库,服务了几乎所有的产品线,包括抖音、今日头条、西瓜视…...
网站程序有哪些/百度站长工具seo综合查询
神经网络(一)神经网络模型理解1.1 模型1.2 神经网络模型(前馈)1.3 建立神经网络模型1.4 多元分类1.5 循环神经网络与对称连接网络(二)神经网络模型实现2.1 代价函数2.2 反向传播2.2.1 数学推导(…...
wordpress 同步/2022社会热点事件及看法
3.2 数据挖掘建模过程 广州TipDM团队在多年的数据挖掘项目实施过程中,积累了一套行之有效的数据挖掘方法论,数据挖掘建模过程如图3-2所示。 3.2.1 定义挖掘目标 针对具体的数据挖掘应用需求,首先要非常清楚:本次的挖掘目标是什么&…...