码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MySQL 中数据表 id 值 连续 且 自动增长


    目录

    1.前置知识——事务

    2. 前置知识——触发器 

    3.前置知识——MySQL中符号@的作用 

    4. 回归正题,如何实现将id值连续且自动增长


    1.前置知识——事务

    参考链接:具体事务知识,点击这里详细查看 

     事务隔离级别:

    1. 读未提交 read uncommitted
    2. 读已提交 read committed
    3. 可重复读 repeatable read
    4. 串行化 serializable

    查看全局系统隔离级别

    select @@global.transaction_isolation;

     查看当前系统隔离级别

    select @@transaction_isolation;

    2. 前置知识——触发器 

    参考链接:MySQL 循环知识了解

    参考链接:触发器知识,点击了解详情

    参考链接:基本MySQL 语法,如创建表、修改表数据

    触发器类型:

    1. INSERT 型触发器【NEW 表示将要或者已经新增的数据】
    2. UPDATE 型触发器【OLD表示修改之前的数据,NEW 表示将要或已经新增的数据】
    3. DELETE 型触发器【OLD表示将要或者已经删除的数据】

     假设有这样一张数据表

    1. CREATE TABLE `test_trans` (
    2. `id` int NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
    3. `create_time` datetime DEFAULT NULL COMMENT 'Create Time',
    4. `name` varchar(255) DEFAULT NULL,
    5. PRIMARY KEY (`id`)
    6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试事务'

    创建触发器的格式

    • 创建只有1个执行语句的触发器

            create trigger 触发器名 before|after 触发事件 on 表名 for each row

                    执行语句;

    •  创建有多个执行语句的触发器

            create trigger 触发器名 before|after 触发事件 on 表名 for each row

            begin
                执行语句列表

            end;

    查看触发器

            SHOW TRIGGERS; 

    3.前置知识——MySQL中符号@的作用 

    参考链接:更多关于@的知识,点击此链接

    参考链接:关于MySQL 游标的相关知识

    参考链接:MySQL的预处理技术,prepare 的使用 

    变量名,如果你不加@的话,会认为这是一个列名,但是这列不存在,就报错了;

    • @变量名 : 定义一个用户变量.
    • = 对该用户变量进行赋值.

    用户变量赋值有两种方式: 一种是直接用"=“号,另一种是用”:=“号。

    其区别在于:

    • 使用set命令对用户变量进行赋值时,两种方式都可以使用;
    • 用select语句时,只能用“:=”方式,因为select语句中,”="号被看作是比较操作符。

    我曾遇到过一些问题(现已解决,可以参考这些链接):

    1. 声明游标一定要在声明变量之后
    2. 触发器内,一定不要使用UPDATE、INSERT、DELETE
    3. 关于使用变量值修改auto_increment的问题

    4. 回归正题,如何实现将id值连续且自动增长

    创建存储过程(reorder_id)

    1. -- -------------------------------------------------------
    2. -- test_trans 数据表【reorder_id】
    3. -- 对 id 重新排序(使id连续)
    4. -- 前提:
    5. -- 1. id 是 主键
    6. -- 2. id 必须设置自增
    7. -- -------------------------------------------------------
    8. CREATE PROCEDURE reorder_id()
    9. BEGIN
    10. -- 声明变量
    11. DECLARE i INT DEFAULT 1;
    12. DECLARE cursor_id INT DEFAULT 0;
    13. -- 1. 声明游标
    14. DECLARE temp_cursor CURSOR FOR SELECT id FROM test_trans;
    15. -- 获取数据的总条数
    16. SET @total = 0;
    17. SELECT COUNT(id) INTO @total FROM test_trans;
    18. -- 2. 打开游标
    19. OPEN temp_cursor;
    20. -- 3. 循环(使用游标)
    21. WHILE i <= @total DO
    22. FETCH temp_cursor INTO cursor_id;
    23. UPDATE test_trans SET id = i WHERE id = cursor_id;
    24. SET i = i + 1;
    25. END WHILE;
    26. -- 4. 关闭游标
    27. CLOSE temp_cursor;
    28. SET @total = @total + 1;
    29. -- 执行预处理
    30. -- 预处理
    31. SET @total_sql = concat("ALTER TABLE test_trans AUTO_INCREMENT = ",@total);
    32. PREPARE sql_auto from @total_sql;
    33. EXECUTE sql_auto;
    34. END

    创建存储过程后,进行调用(CALL reorder_id();)就能实现id值按升序连续排序

    注意事项:

    1.  id 值设置为主键 且 自动递增 
    2.  id 值一定要升序,不能让后面的数据id小于前面数据的id
    3.  每次要使id连续,需要调用CALL reorder_id();

    演示:

    假设有这样一张数据表,如下图所示

     将id打乱,删除其中几条数据(保持升序)

     调用存储过程CALL reorder_id();

     再次新增数据,发现id值又从4开始

     文章完

  • 相关阅读:
    C# 对字符串判空方法
    Spring Boot集成zipkin快速入门Demo
    服务器向客户端推送消息之——WebSocket详细使用
    5.验证面试高频问题整理(附答案)
    【Composite模式】C++设计模式——组合模式
    如何自动生成一本epub电子书
    TCP 连接管理机制(一)——TCP三次握手详解 + 为什么要有三次握手
    pandas数据离散化
    作用域和作用域链
    【附源码】计算机毕业设计SSM图书商城
  • 原文地址:https://blog.csdn.net/qq_56402474/article/details/127815920
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号