MySQL UPDATE时主键冲突引发的思考(2)
作者:叶金荣 来源:IT专家网 发布时间:2008-06-21 17:00:00
标签:mysql,表,错误
清空后,自己重新手工插入记录,再看看。
mysql> INSERT INTO `a` VALUES (2,2),(3,3),(5,5),(4,4),(6,6),(7,7);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from a;
+----+---------+
| id | city_id |
+----+---------+
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
+----+---------+
还是按照 id 的顺序来显示,然后我们再次执行之前的 update 语句:
mysql> update a set id = id - 1;
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6 Changed: 6 Warnings: 0
可以看到,在 innodb 表的情况下,更新是可以成功的。
现在我们来分析下。
myisam表是堆组织表(Heap Organize Table, HOT),它的索引是采用 b-tree 方式存储的,数据显示时是随机顺序,而非按照主键的索引顺序来显示。
而innodb表是索引组织表(Index Organized Table, IOT),它的索引则是采用 clustered index 方式,因此主键会按照顺序存储,每次有记录有更新时,会重新整理更新其主键。因此无论是直接从 myisam 表转换过来的,还是后来插入的记录,显示时都会按照主键的顺序。
更新数据时,如果没有指定排序的字段或索引,则默认以随机顺序更新,所以 myisam 表如果不指定 ORDER BY 的话,则采用默认的存储顺序来更新,所以会发生主键冲突的情况。而 innodb 表总是有主键(如果没有定义,则也有默认主键),如果更新时没有指定排序字段或索引,则按照主键顺序来更新,在上面的例子中,就是按照主键 id 的顺序来更新了,因此不会报错。


猜你喜欢
- 需求每天往一个表里面插入两条数据,但日期不同INSERT INTO test(`id`, `art_training_institution
- 包 packageGo 包是 Go 语言的基本组成单元,一个 Go 程序就是一组包的集合,所有 Go 代码都位于包中Go 源码可以导入其他
- 前言:数据库非常重要,程序的数据增删改查需要数据库支持。python处理数据库非常简单。而且不同类型的数据库处理逻辑方式大同小异。本文以sq
- DOME<input type="file" @change="upload" ref=&qu
- 如何巧用三元表达式一开始我并不喜欢阅读别人的代码,话说程序员最讨厌的事:写代码要写文档、写代码要写注释、别人的代码没有文档、别人的代码没有注
- 实现方法分位三步:在template中设置2个按钮,通过v-if ,v-show来控制;data中设置按钮的默认值;methods中控制点击
- 前言:上一篇文章详细介绍windows下MySQL安装教程,这篇就从最基本的安装MySQL-Linux环境开始,感兴趣的小伙伴可以关注我,系
- 过往经验总结注:笔者写本文的目的不是完整细致地描述连接的全过程,而是记录当中遇到的现象、问题,及为什么会产生这个问题的分析。所以部分过程会省
- GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一
- -- 任意的测试表 代码如下:CREATE TABLE test_delete( name varchar(10), value INT )
- 1. 卡住是怎么办按照以下步骤, 前提是你需要懂点英文:尽可能自己想办法解决仔细阅读相关文档, 确保不错过任何相关内容在Google, 百度
- 用一句话概括冷备,就是把数据库服务,比如MySQL,O
- 使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固
- 不知不觉2008已经走到了尽头,在这近一年中,一直不断的尝试用ExtJS做项目,从1.1到现在的2.2,吃了不少苦头,也有不少收获,总结一
- 本文实例讲述了Sanic框架异常处理与中间件操作。分享给大家供大家参考,具体如下:简介Sanic是一个类似Flask的Python 3.5+
- 在记忆里,关于时间方面常的SQL也就下面这两个了,大多数朋友问题中所涉及到的数据库都ACCESS的,在些,也就写出这两SQL了。年代久远,目
- 博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量
- 使用python实现文件导入,具体方法如下:文件样例可以自己random这里的temp1根据每一行的分隔符来读入,‘\n'表述回车t
- for循环基本语法格式: for(初始化变量;条件表达式;操作表达式){  
- 如下所示:import arcpy... from arcpy import env... env.workspace="C:\\