MYSQL AUTO_INCREMENT奇技淫巧

MySQL堆叠注入原理与实战:从HANDLER语句到权限提升 SQL注入是Web安全领域的核心漏洞类型,其本质是攻击者通过构造恶意输入,篡改后端数据库查询逻辑。在众多注入技术中,堆叠注入因其能执行多条SQL语句而危害显著。它允许攻击者在权限允许时进行创建表、删除数据等高危操作,技术价值在于将数据窃取升级为数据库控制。在应用场景上,堆叠注入常见于使用特定数据库连接方式(如PHP的mysqli_multi_query)且未严格过滤分号的Web系统。本文聚焦MySQL环境,深入解析堆叠注入的利用条件,并重点探讨HANDLER语句这一独特技巧。HANDLER作为MySQL底层 阅读详情

产品提了新需求,被删除掉的回贴不显示,删除后,每个帖子的楼层数保持不变,帖子A是第二个回贴,帖子B是第三个回贴,删除掉A后,A不出现在回帖列表,但是B的楼层数还是显示3。

于是需要记录下每个回贴的楼层数,在回帖表里增加字段记录楼层。原来的表结构是

CREATE TABLE `comment` (

 `id` bigint(20) NOT NULL,      评论的帖子ID

 `articleId` bigint(20) DEFAULT NULL,  主贴ID

 UNIQUE KEY `ARTICLE_FLOOR_INDEX` (`articleId`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |


最开始的思路是利用mysql 自增字段的特性,可以增加个楼层floor字段,并且和主贴编号articleId建组合索引,floor字段按articleId分组自增。

mysql> CREATE TABLE `comment` (

 `id` bigint(20) NOT NULL,

 `articleId` bigint(20) DEFAULT NULL,

 `floor` int(10) NOT NULL AUTO_INCREMENT,

  KEY`ARTICLE_FLOOR_INDEX` (`articleId`,`floor`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULTCHARSET=latin1 ;

报错:

1075 - Incorrect table definition; therecan be only one auto column and it must be defined as a key

 

 

自增字段floor必须是索引的第一个字段。把索引的两个字段对调如下:

mysql> CREATE TABLE `comment` (

 `id` bigint(20) NOT NULL,

 `articleId` bigint(20) DEFAULT NULL,

 `floor` int(10) NOT NULL AUTO_INCREMENT,

  KEY`ARTICLE_FLOOR_INDEX` (`floor`,`articleId`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULTCHARSET=latin1 ;

Query OK, 0 rows affected

 

这里用测试数据插入了九行。

insert into comment(id,articleId) values(1,1000),(2,2000),(3,3000),(4,1000),(5,2000),(6,3000),(7,1000),(8,2000),(9,3000);

 

看到floor字段按照articleId分组自增。

mysql> select * from comment order by articleId;

+----+-----------+-------+

| id | articleId | floor |

+----+-----------+-------+

|  1|      1000 |     1 |

|  4|      1000 |     2 |

|  7|      1000 |     3 |

|  2|      2000 |     1 |

|  5|      2000 |     2 |

|  8|      2000 |     3 |

|  3|      3000 |     1 |

|  6|      3000 |     2 |

|  9|      3000 |     3 |

+----+-----------+-------+

9 rows in set

 

但是查询时最常用的where 条件是articleId=xxxx,如果按照这样建立索引,查询性能不好,

需要全表扫描,rows=9。

explain select * from comment where articleId=1000;

+----+-------------+---------+------+---------------+------+---------+------+------+-------------+

| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra       |

+----+-------------+---------+------+---------------+------+---------+------+------+-------------+

|  1| SIMPLE      | comment | ALL  | NULL          | NULL | NULL    | NULL |   9 | Using where |

+----+-------------+---------+------+---------------+------+---------+------+------+-------------+

1 row in set

 

山穷水尽疑无路,柳暗花明又一村。数据表引擎修改后为myisam,自增字段就不需要强制放在索引的第一列。

mysql> CREATE TABLE `comment` (

 `id` bigint(20) NOT NULL,

 `articleId` bigint(20) DEFAULT NULL,

 `floor` int(10) NOT NULL AUTO_INCREMENT,

  KEY`ARTICLE_FLOOR_INDEX` (`articleId`,`floor`) USING BTREE

) ENGINE=myisam AUTO_INCREMENT=10 DEFAULTCHARSET=latin1 ;

Query OK, 0 rows affected

 

再看看查询效率

mysql> explain select * from comment where articleId=1000;

+----+-------------+---------+------+---------------------+---------------------+---------+-------+------+-------+

| id | select_type | table   | type | possible_keys       | key                 | key_len | ref   | rows | Extra |

+----+-------------+---------+------+---------------------+---------------------+---------+-------+------+-------+

|  1| SIMPLE      | comment | ref  | ARTICLE_FLOOR_INDEX | ARTICLE_FLOOR_INDEX |9       | const |    3 | NULL |

+----+-------------+---------+------+---------------------+---------------------+---------+-------+------+-------+

 

rows=3,已经把索引充分利用起来。

结论: where子句中使用最频繁的一列放在组合索引的最左边。

 

理论上问题应该解决了,但万万没想到的是最重要的一点,原来的程序框架底层必须要使用事务,InnoDB支持事务,MyISAM不支持,一个美好巧妙的设计就被破坏掉。又乖乖的按照土方法来。

CREATE TABLE `comment` (

 `id` bigint(20) NOT NULL,

 `articleId` bigint(20) DEFAULT NULL,

 `floor` int(10) NOT NULL,

  KEY`ARTICLE_FLOOR_INDEX` (`articleId`,`floor`) USING BTREE

) ENGINE=InnoDB  AUTO_INCREMENT=10 DEFAULTCHARSET=latin1

 

 

 

SQL注入实战:绕过黑名单与联合查询技巧深度解析 SQL注入是Web安全领域的核心漏洞类型之一,其本质是攻击者通过构造恶意输入,篡改后端数据库查询逻辑,从而窃取或操纵数据。其技术原理在于应用程序未对用户输入进行充分过滤或采用不安全的SQL拼接方式,使得输入数据被误执行为代码。在攻防对抗中,黑名单过滤是一种常见但脆弱的防御手段,攻击者可通过大小写变形、双写关键字、内联注释、等价替换及编码混淆等多种技巧绕过。联合查询(Union Select)作为高效的信息获取方式,常与这些绕过技术结合,用于在存在基础过滤的实战环境中快速提取数据库信息。本文聚焦于当联合查询遭 阅读详情

相关推荐

大道至简:软件开发中的KISS原则与YAGNI实践指南

在软件工程领域,KISS(Keep It Simple, Stupid)原则强调通过简化设计提升代码可维护性,其核心原理是减少不必要的复杂度以降低错误率。这一理念的技术价值在于能够显著提高开发效率和系统稳定性,尤其在微服务架构和RESTful API设计中体现明显。通过遵循单一职责函数、避免深层嵌套等具体实践,开发者可以在电商订单处理、用户权限管理等典型应用场景中实现代码的优雅简化。本文基于KISS原则和YAGNI(You Ain't Gonna Need It)理念,深入探讨如何避免过度工程化,帮助工程师

weixin_33787529的博客 352

sql 创建表时AUTO_INCREMENT=10

默认地,主键的开始值是 1,每条新记录递增 1,AUTO_INCREMENT=10 代表初始值为10。

Mr.horse的博客 732

bcftools学习笔记(一)

欢迎关注"生信修炼手册"!本篇主要介绍index, view, query, sort, reheader这五个命令。1. indexindex命令用于对VCF文件建立索...

庐州月光的博客 6012

MySQL使用AUTO_INCREMENT列的表注意事项之update自增列篇

1)对于MyISAM表,如果用UPDATE更新自增列,如果列值与已有的值重复,则会出错;如果大于已有的最大值,则会自动更新表的AUTO_INCREMENT,操作是安全的。 (2)对于innodb表,update auto_increment字段,如果列值与已有的值重复,则会出错;如果大于已有的最大值,可能会引入一个坑,会造成编号重复错误,插入数据失败的情况,可见在update自增列值是...

axfcjwkbi259888707的博客 275

VS2010“未能正确加载包”问题解决方法小汇

本文按照由简至繁的顺序详述了借助网络获知的四种解法,主要面向重装 VS2010 后遭遇题述问题的网友,相关包尤指 VSTS、RadLangSvc、Language、Bootstrap 及 MicrosoftDataEntityDesign。

虚有其表的博客 1万+

Python自动化测试报告:飞书群机器人消息卡片实战

本文详细介绍了如何利用Python和飞书群机器人实现自动化测试报告的智能通知。通过构建可定制的消息卡片,将测试结果(如通过数、失败数)以清晰、美观的格式自动推送至团队群聊,并支持一键跳转查看详细报告,从而显著提升团队协作与问题响应效率。

k6l7m8n9的博客 811

MySql中重新设置AUTO_INCREMENT自增值方法

查询表名为tableName的auto_increment值: SELECT AUTO_INCREMENT FROM information_schema.tables WHEREtable_name='tableName'; 修改表名为tableName的auto_increment值: ALTER TABLE tableName auto_increment=number ;

LEE的博客 3万+

R语言 | 关联规则

关联规则(AssociationRules)是无监督的机器学习方法,用于知识发现,而非预测。 关联规则的学习器(learner)无需事先对训练数据进行打标签,因为无监督学习没有训练这个步骤。缺点是很难对关联规则学习器进行模型评估,一般都可以通过肉眼观测结果是否合理。 关联规则主要用来发现Pattern,最经典的应用是购物篮分析,当然其他类似于购物篮交易数据的案例也可以应用关联规则进行模式发现。

I think so I am 10万+

mysql语句中的自增自减排序_Memcached incr/decr 自增或自减操作

Memcached incr 与 decr 命令Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。incr 命令语法:incr 命令的基本语法格式如...

weixin_32451453的博客 659

DeepMD-kit描述子机制解析:从原子坐标到不变性特征

本文深入解析DeepMD-kit描述子机制,详细阐述如何将原子坐标转换为具有平移、旋转和排列不变性的特征表示。探讨了se_e2_a、se_e3等不同描述子的适用场景及性能优化技巧,帮助读者掌握这一关键技术在分子模拟中的应用实践。

weixin_42520661的博客 340

k230+CanMV+micropython环境下byte、int、hex、string之间的转换常用函数实测

【代码】k230+CanMV+micropython环境下byte、int、hex、string之间的转换常用函数实测。

weixin_47446386的博客 120

mysql order by incr_MySQL 简单存储过程实现Redis的INCR功能

DROP PROCEDURE IF EXISTS pro_testincrement;DELIMITER &&CREATE PROCEDURE pro_testincrement(IN inr int)BEGINDECLARE i INT DEFAULT 0;select max(id) into i from testpro;update testpro set id = id+...

weixin_42601547的博客 347

AI绘画与医疗可视化:用AI生成医学插图的实践

医疗可视化是医学教育、临床沟通和学术研究的核心工具。传统医学插图依赖手工绘制或专业3D建模,存在制作周期长、成本高、更新迭代慢等问题。随着深度学习技术的发展,AI绘画工具(如Stable Diffusion、DALL-E)展现出强大的图像生成能力,但医疗领域对插图的解剖准确性、标注规范性和语义完整性有极高要求,通用AI模型难以直接应用。本文聚焦AI技术与医疗领域的交叉创新,系统阐述如何通过数据预处理、模型定制化训练和后处理校验,构建符合医疗标准的插图生成系统。

大模型应用工坊 1788

MySQL :如何确保字段值在特定范围内?

本文将详细介绍如何确保 MySQL 数据库中字段值处于特定范围内。我们主要从约束(如 CHECK 约束)、触发器和应用程序逻辑三个方面入手,分析各自的实现方式、适用场景及优劣势。同时,我们将探讨这些方法的组合策略,以应对不同复杂度的业务需求。通过本文,您将掌握如何高效、可靠地控制字段值范围,提升数据库设计的规范性和数据完整性。

yanpeng2580的博客 1046

【原创教程】西门子1500与施耐德伺服的通讯以及调试

该函数块主要描述伺服的手动,左边的引脚Forward是指伺服手动正转,Backward是指伺服手动反转,Fast是指手动的某个方向为快速运行,TipPos手册上描述为固定值,WaitTIme是指伺服手动的相应时间,VeloSlow指伺服手动正常慢速运动的速度,VeloFast指伺服手动快速运动的速度,Acceleration是指伺服手动的加速度,Decelertion是指伺服手动的减速度。该函数块用于伺服停止,左边的引脚Execute为伺服停止执行,Deceleration含义为减速,Axis为轴。

Qinmingyue13的博客 1376

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL之count(1)和count(*)的区别

闲扯 很久以前,有一次我写了一个SQL: select count(*) from test; 然后这个代码被我的其中一家公司的MySQL专家看到了,叫我过去说: 你难道不知道咱们不允许写count(*)吗?你不知道count(1)更快吗? 说完二话没说把我的SQL改了。 我自然是惴惴不安。 谁对谁错 先说结论,我是对的,count(*)不但不慢,count(1)也会和coun...

天高任鸟飞,海阔凭鱼跃 4060

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MySQL DQL 数据查询

需要注意的是,SHOW TABLE STATUS 命令返回的行数是一个近似值,并不是实时的准确值。SELECT 支持显式分区选择,使用 PARTITION 子句,在 table_references 表的名称后面跟着一个分区或子分区列表(或两者都有)在这种情况下,只从列出的分区中选择行,而忽略表的任何其他分区。实际上,在 MySQL 中(仅限于 MySQL) CROSS JOIN 与 INNER JOIN 的表现是一样的,在不指定 ON 条件得到的结果都是笛卡尔积,反之取得两个表各自匹配的结果。

Doublelv 的博客专栏。 796

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

插入2万调数据耗时_MySQL亿级数据性能测试

经常有人说,数据库单表不要超过500万行,这有没有道理呢?本文我们不谈数据库技巧也不谈优化方式,只是用实例来给大家演示一下,数据表数据激增给查询性能带来的影响。测试环境之前阿里云活动,刚好搞了1个“云数据库 RDS版”,本次刚好拿来测试,配置如下:数据库类型:MySQL 5.7 CPU:1核 数据库内存:1024MB模拟“用户信息表”来进行测试,建立以下数据表:CREATE TABLE `user...

weixin_39830688的博客 1145

Ubuntu 20.04 手动部署 LAMP 栈:原理、安全与工程实践

LAMP(Linux + Apache + MySQL + PHP)是 Web 服务最基础的开源技术栈,其核心在于操作系统、Web 服务器、数据库与脚本语言的协同机制。理解各组件的进程模型、配置加载顺序、用户权限隔离及日志体系,是实现稳定部署与高效排障的前提。在 Ubuntu 20.04 这一长期支持版本中,APT 包管理提供的标准化路径、FHS 文件布局与 systemd 服务集成,构成了可审计、可复现的运维基线。技术价值体现在对最小权限原则、时区一致性、认证插件演进(如 auth_socket 到 ca

aebe49167的博客 432

SQL注入实战指南:从原理到CTFshow通关技巧

SQL注入是一种常见的Web安全漏洞,其原理在于攻击者通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取、篡改或破坏数据。这项技术的核心价值在于揭示了输入验证与参数化查询在安全开发中的重要性。在渗透测试与CTF竞赛等应用场景中,掌握SQL注入的各类手法与绕过技巧是安全工程师的必备技能。本文聚焦于联合查询注入、布尔盲注等实战技术,并结合CTFshow典型题目,深入解析如何通过手工构造Payload来应对复杂的过滤与防御机制,为读者提供一套从信息收集到最终利用的完整解题框架。

weixin_30596165的博客 438

MySQL 中 auto_increment 自动插入主键值

使用auto_increment 自动插入主键值

威威的博客 1140

MySQL设置表的属性值自动增加 auto_increment

MySQL登录、查看记录等基本操作 1. 属性介绍 设置表的属性自动增加:在数据库应用中,有时候我们会希望在插入新纪录时,系统自动生成字段的主键值。 设置自动编号的列必须为int、tinyint、 smallint等整数类型。 关键词:auto_increment 默认情况下初始值和增量都是1。 注意:如果要添加的是中文默认值,则需要加上DEFAULT CHARSET=utf8;使用英文字符则不需要 2.创建表 create table tmp1 ( id int primary key,

斯文~ 8399

【MySQL】轻松学习 列的完整性约束3(自动增长和设置默认)

列的完整性约束,设置表字段值自动增加(AUTO_INCREMENT是MySQL唯一扩展的完整性约束,当向数据库表中插入新记录时,字段上的值会自动生成唯一的ID。在具体设置AUTO_INCREMENT约束时,一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。由于设置AUTO_INCREMENT约束后的字段会生成唯一的ID,因此该字段也经常会同时设置成PK主键。默认值(DEFAULT)当为数据库表中插入一条新记录时,如果没有为某个字段赋值,数据库系统就会自动为这个字段插入默认值。

qq_54169998的博客 2058

【MySQL语法】序列 AUTO_INCREMENT和Sequence

目录 1. 构建序列 2. AUTO_INCREMENT 3. MySQL实现Sequence 3.1. 实现 3.2. 问题解决 1. 构建序列 一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置开始索引、是否循环等; 最重要的是一张表只能由一个字段使用自增,但有的时候我们需要两个或两个以上的字段实现自增(单表多字段自增),MySQL本身是实现不了的,但我们可以用创建一个序

baidu_34170531的博客 1406

Mysql 常用命令集合

Mysql 常用命令集合

Ys8888N的博客 618

MySQL数据库自增长AUTO_INCREMENT探讨

文章中所有操作均是在 MySQL 5.7 版本下进行的 MySQL 的自增列(AUTO_INCREMENT)和其它数据库的自增列对比,有很多特性和不同点(甚至不同存储引擎、不同版本也有一些不同的特性),让人感觉有点稍微复杂。下面我们从一些测试开始,了解一下这方面的特殊知识点。 自增列持久化问题 自增长在不同的存储引擎下,呈现的问题是不一样的,下面我们举例说明(MySQL 5.7.30 版本中实验)。 InnoDB存储引擎的问题 /* 把之前的测试表删掉,重启服务器,为了更好的展示效果 */ -- 创建..

初八 3452
上一篇: 接入层高性能缓存技术nginx+redis利器
下一篇: 抄底dubbo底层的数据包格式
ChainCode
ChainCode 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄11年 115粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值