Mysql 怎么产生隐藏主键 和 还要不要学MySQL

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(共2150人左右 1 + 2 + 3 + 4 +5) 新人奖直接分配到5群,另欢迎 OpenGauss 的技术人员加入。

918e0e8dc22679b37ee35345fb60dd54.png

MySQL 要不要学的这个问题,回答是一定要学,继续学,哪怕不用。实际上最近有人已经问了这个问题了,还有人问ORACLE 要不要学的问题,我觉得这个些提问题的人,很奇怪,如果有觉得你有更值得要学的数据库,马上要用的数据库可以去学,没有必要问,ORACLE,MYSQL要不要学,你问我就会告诉你,学一定要学。

提出这些问题的人有一个思路,就是我未来用的到用不到这些知识,比如我公司现在主流的数据库不是MYSQL 是POLARDB 和 PostgreSQL 当然这两个我要学,但ORACLE MySQL一点学习的必要都没有,我是认为太绝对了,你那天从单位毕业了,其他JD要求会 ORACLE MYSQL你是不是就傻眼了,或者说MYSQL 和ORACLE 在数据库业界的地位和原理,哪里不值得你去学习,增加自己的对于数据库原理的理解,增加你数据库职业的底蕴,所以别问我,问就是学。

最近我写PG和MYSQL的量的确是少了,1是工作忙,事情多 2 的确经历在PG 和 POLARDB 的上面更多了,但MYSQL 会继续的。今天我们来说说MySQL的 invisible primary key.

首先invisible primary key是MySQL 8.030推出的GIPK 的功能,主要的原因在一些程序设计中,的确忽略了主键的设计,但基于mysql的原理和推行的 innodb cluster 的部分对于表的主键的强需求,MySQL一直是不允许有没有主键的情况,基于这些原因,所有推出了 invisible primary key .

在调整完参数重启数据库,我们在查看系统的状态

mysql> SELECT @@sql_generate_invisible_primary_key;
+--------------------------------------+
| @@sql_generate_invisible_primary_key |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.31    |
+-----------+
1 row in set (0.01 sec)

af058d6c70bbf3a150564934bd856568.png

那么我们需要做一个实验,在系统中我们创建 2个表,一个在sql_generate_invisible_primary_key=ON 的情况下,一个在sql_generate_invisible_primary_key=OFF 在建立一个表我们查看表的情况。

mysql> show create table test;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                        |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` smallint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

上面是标准的方式来进行mysql表建立的语句,下面我们将primary key 去掉,然后我们看相关的产生的表是什么状态。

下图中我们可以看到,如果在原有的语句中,来建立没有主键的表是不能建立,会报错,因为MYSQL会自动建立主键并且是自增的,所以不允许没有主键同时还建立自增字段,直接在建立的时候就报错。

Failed to generate invisible primary key. Auto-increment column already exists.

mysql> create table test_1 (id int AUTO_INCREMENT,name varchar(20),age smallint);
ERROR 4109 (HY000): Failed to generate invisible primary key. Auto-increment column already exists.
mysql> 
mysql> 
mysql> create table test_1 (id int,name varchar(20),age smallint);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table test_1;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                                                                                                                   |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_1 | CREATE TABLE `test_1` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  `id` int DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` smallint DEFAULT NULL,
  PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

那么我们在建立的时候,去掉的自增此时我们的里面在建立语句的时候可以看到自动建立了一个 my_row_id的主键,并且为自增的和无符号来进行,以bigint 作为字段的类型。

mysql> SET sql_generate_invisible_primary_key=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test_1 (id int,name varchar(20),age smallint);
ERROR 1050 (42S01): Table 'test_1' already exists
mysql> 
mysql> 
mysql> create table test_2 (id int,name varchar(20),age smallint);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table test_2;
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                         |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_2 | CREATE TABLE `test_2` (
  `id` int DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` smallint DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

在会话层关闭选项,后在建立表与我们之前的预想的状态一致,没有新建表没有任何的主键。在我们对于三个表进行 select 的情况下,对于中间的test_1 表没有看到 my_row_id 的字段,这里这个字段的确是对于表隐藏了。

mysql> select * from test;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | session |   35 |
+----+---------+------+
1 row in set (0.00 sec)

mysql> select * from test_1;
+------+---------+------+
| id   | name    | age  |
+------+---------+------+
| NULL | session |   35 |
+------+---------+------+
1 row in set (0.00 sec)

mysql> select * from test_2;
+------+---------+------+
| id   | name    | age  |
+------+---------+------+
| NULL | session |   35 |
+------+---------+------+
1 row in set (0.00 sec)

这里通过alter语句来对表隐藏的字段进行显示操作,和隐式操作。

mysql> alter table test_1 alter column my_row_id set visible;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from test_1;
+-----------+------+---------+------+
| my_row_id | id   | name    | age  |
+-----------+------+---------+------+
|         1 | NULL | session |   35 |
+-----------+------+---------+------+
1 row in set (0.00 sec)

mysql> alter table test_1 alter column my_row_id set invisible;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from test_1;
+------+---------+------+
| id   | name    | age  |
+------+---------+------+
| NULL | session |   35 |
+------+---------+------+
1 row in set (0.00 sec)
mysql> select table_CATALOG,table_name,column_name from columns where column_name = 'my_row_id';
+---------------+------------+-------------+
| TABLE_CATALOG | TABLE_NAME | COLUMN_NAME |
+---------------+------------+-------------+
| def           | test_1     | my_row_id   |
+---------------+------------+-------------+
1 row in set (0.01 sec)

mysql>

相关在mysql中的column中显示添加的字段也是OK 的,同时也可以通过变量将这个字段进行隐藏,但这里觉得没有这个必要,对这部分知识也就滤过了。另外还有一个知识点是关于复制中相关的语句是否会被传递到从库,这里默认这些语句是不会被复制到从库的,复制应用线程会绕过这部分的命令,在8.032后的版本可以通过,REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE 的方式,使副本在给定复制通道中为没有主键的复制表添加生成的不可见主键。

mysql> select table_CATALOG,table_name,column_name from columns where column_name = 'my_row_id';
+---------------+------------+-------------+
| TABLE_CATALOG | TABLE_NAME | COLUMN_NAME |
+---------------+------------+-------------+
| def           | test_1     | my_row_id   |
+---------------+------------+-------------+
1 row in set (0.01 sec)

mysql>

f8f98a221915691bf826dd0c2b374a5a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/476769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Django开发】前后端分离美多商城项目第3篇:用户部分,1. 后端接口设计:【附代码文档】

美多商城项目4.0文档完整教程(附代码资料)主要内容讲述:美多商城,项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业。项目准备,配置1. 修改settings/dev.py 文件中的路径信息,2. INS…

Amazon SageMaker + Stable Diffusion 搭建文本生成图像模型

如果我们的计算机视觉系统要真正理解视觉世界,它们不仅必须能够识别图像,而且必须能够生成图像。文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。 近两年,以ChatGPT为代表的AIGC技术崭露头角,逐渐从学术研究的象牙塔迈…

面试笔记——MySQL(优化篇:定位慢查询、SQL执行计划、索引、SQL优化)

定位慢查询 在MySQL应用中,慢查询 通常指的是执行时间超过一定阈值的查询语句。这个阈值通常由管理员或开发人员根据具体情况设置,一般是以毫秒为单位。慢查询可能会影响系统性能和用户体验,因此需要及时识别和优化。 表象: 页面…

探秘开源隐语:架构深度剖析与隐私计算技术之旅

1.隐语架构 隐语(SecretFlow)作为蚂蚁集团开源的可信隐私计算框架,其架构设计具有多层次的特点,虽然具体分层名称可能会根据实际描述略有差异,但我们可以依据已有的技术和信息对其进行结构化的拆解: 硬件层…

第一单元日考技能

文章目录 第一单元1.请用c程序随机输入20个数(每小题10分)2.①按要求输出*形状3.计算题  s1*12*23*3...100*100 (每问10分)4.1. 使用 C 创建一个简单的计算器,可以实现 , -, *, / 。 if switch5.图形打印 第一单元 1…

Lua | 一篇文章讲清Lua语法及热更新

目录 一、环境搭建 二、Lua语法 1.输出print、单行注释、多行注释 2.变量 (1)nil (2)number (3)string (3.1)字符串长度 (3.2)字符串拼接 &#xf…

LeetCode每日一题——数组串联

数组串联OJ链接:1929. 数组串联 - 力扣(LeetCode) 题目: 思路: 题目说 ans 由两个 nums 数组 串联 形成。那么我们就只需要历遍两次nums数组,将它放在我们的ans数组里。 注意: 题目函数对于我…

Day22:过滤敏感词、开发发布帖子、帖子详情

过滤敏感词 前缀树 - 名称:Trie、字典树、查找树 - 特点:查找效率高,消耗内存大 - 应用:字符串检索、词频统计、字符串排序等在这里插入图片描述 敏感词过滤器的步骤 根节点不包含任何字符;其余每个节点只有一个字符;连接起来一条路就是字…

StarRocks 助力金融营销数字化进化之路

作者:平安银行 数据资产中心数据及 AI 平台团队负责人 廖晓格 平安银行五位一体,做零售金融的领先银行,五位一体是由开放银行、AI 银行、远程银行、线下银行、综合化银行协同构建的数据化、智能化的零售客户经营模式,这套模式以数…

python 爬虫爬取地理空间高程图GDEMV2 30m 中国地形

一.配置Python 爬虫 环境 from selenium import webdriver import time # from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keys # from selenium.webdriver.comm…

算法体系-14 第十四 贪心算法(上)

一 、 递归套路解决判断完全二叉树 1.1 描述 1.2 分析 1.3 代码 public static boolean isCBT2(Node head) {return process(head).isCBT;}public static class Info {public boolean isFull;public boolean isCBT;public int height;public Info(boolean full, boolean cbt…

学习人工智能:Attention Is All You Need-1-介绍;Transformer模型架构

Transformer模型是目前最成功的chatGPT,Sora,文心一言,LLama,Grok的基础模型。 《Attention Is All You Need》是一篇由Google DeepMind团队在2017年发表的论文,该论文提出了一种新的神经网络模型,即Trans…

个人可以做知识付费网站吗

个人可以做知识付费网站吗 个人能够做学问付费网站吗?答案是肯定的!如今个人做学问付费网站并不需求太多的资金和技术支持,我们只需求购置一台效劳器或虚拟主机,然后在该主机空间上搭建一个WordPress网站,最后运用带有…

0基础学习VR全景平台篇第146篇:为什么需要3D元宇宙编辑器?

一.什么是3D元宇宙编辑器? 3D元宇宙编辑器是全新3DVR交互渲染创作工具,集3D建模、虚拟展厅、AI数字人等能力,渲染和虚拟现实技术于一身的生产力工具。 具有跨平台和随时随地编辑等特点,可广泛应用于展会、展厅、博物馆、可视化园…

基于python+vue的幼儿园管理系统flask-django-php-nodejs

随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术,提出了一种活动信息、课程信息、菜谱信息、通知公告、家…

MySQL索引(图文并茂)

目录 一、索引的概念 二、索引的作用 三、创建索引的原则依据 四、索引的分类和创建 1、索引的分类 2、索引的创建 2.1 普通索引 2.1.1 直接创建索引 2.1.2 修改表方式创建 2.1.3 创建表的时候指定索引 2.2 唯一索引 2.2.1 直接创建唯一索引 2.2.2 修改表方式创建 …

机器学习——决策树(三)预剪枝

观前提示:这是本人机器学习决策树内容的第三篇博客,沿用了之前相关的代码,包括信息增益计算函数、结点类、预测函数和分类精度计算函数 完整代码指路 DrawPixel/decisionTree.ipynb at main ndsoi/DrawPixel (github.com) 前两篇博客详见…

水泥领域智慧工厂物联网解决方案

水泥领域智慧工厂物联网解决方案 在水泥生产行业中,构建智慧工厂物联网解决方案已经成为推动产业升级、实现智能制造的关键路径。该方案深度融合了先进的信息技术与传统的水泥生产工艺,通过全面感知、可靠传输、智能处理等环节,实现了对整个…

Macos docker安装达梦数据库

官网下载达梦docker镜像安装包 导入安装包 docker load -i /Users/yeungsinsin/Downloads/dm8_20230808_rev197096_x86_rh6_64_single.tar查看导入的镜像 docker images4. docker run 启动容器 docker run -d -p 30236:5236 --restartalways --name dm8 --privilegedtrue -e…

是德科技keysight N9917A微波分析仪

181/2461/8938产品概述: N9917A 是一款使用电池供电的便携式分析仪;基本功能是电缆和天线分析;配置还包括频谱和网络分析仪、可选的内置功率计和矢量电压表。 N9917A FieldFox 手持式微波分析仪 主要特性和功能 18 GHz 最大频率&#xfef…