首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL主键为何单调递增说起

表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

2.1K30

MySQL重大Bug!自增主键竟然不是连续递增

很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗?...所以自增id只保证是递增的,但不保证是连续的! 自增锁的养成计划 所以自增id的锁并非事务锁,而是每次申请完就马上释放,其它事务可以再申请。其实,在MySQL 5.1版本之前,并不是这样的。...该参数的值为0时,表示采用5.0的策略,设置为1时: 普通insert语句 申请后,马上释放; 类似insert … select 这样的批量插入语句 等语句结束后,才释放 设置为2时,所有的申请自增主键的动作都是申请后就释放锁...为什么默认设置下的insert … select 偏偏要使用语句级锁?为什么该参数默认值不是2? 为了数据的一致性。...即批量插入数据的语句,之所以需要这么设置,是因为“不知道要预先申请多少个id”。 既然不知道要申请多少个自增id,那么最简单的就是需要一个时申请一个。

3.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL重大Bug!自增主键竟然不是连续递增

    很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗?...所以自增id只保证是递增的,但不保证是连续的! 自增锁的养成计划 所以自增id的锁并非事务锁,而是每次申请完就马上释放,其它事务可以再申请。其实,在MySQL 5.1版本之前,并不是这样的。...该参数的值为0时,表示采用5.0的策略,设置为1时: 普通insert语句 申请后,马上释放; 类似insert … select 这样的批量插入语句 等语句结束后,才释放 设置为2时,所有的申请自增主键的动作都是申请后就释放锁...为什么默认设置下的insert … select 偏偏要使用语句级锁?为什么该参数默认值不是2? 为了数据的一致性。...即批量插入数据的语句,之所以需要这么设置,是因为“不知道要预先申请多少个id”。 既然不知道要申请多少个自增id,那么最简单的就是需要一个时申请一个。

    2.6K00

    mysql乱码设置

    MySQL默认字符编码的设置 MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以UTF-8为例来说明  需要注意的是,要修改的地方非常多,相应的修改方法也很多...下面是一种最简单最彻底的方法:  一、Windows  1、中止MySQL服务  2、在MySQL的安装目录下找到my.ini,如果没有就把my-medium.ini复制为一个my.ini...即可  3、打开my.ini以后,在[client]和[mysqld]下面均加上default-character-set=utf8,保存并关闭  4、启动MySQL服务  二、Linux... 1、中止MySQL服务(bin/mysqladmin -u root shutdown)  2、在/etc/下找到my.cnf,如果没有就把MySQL的安装目录下的support-files...服务(bin/mysqld_safe &)  非常简单,这样的修改一劳永逸,今后MySQL一切相关的默认编码均为UTF-8了,创建新表格的时候无需再次设置  需要注意的是,当前数据库中已经存在的数据仍保留现有的编码方式

    3.8K60

    最长递增子序列

    最长递增序列不要求数组元素连续问题,返回递增序列长度和递增序列。o(n^2)做法,顺序比较以第i个元素开头的递增序列即可。...我们定义LIS[N]数组,其中LIS[i]用来表示以array[i]为最后一个元素的最长递增子序列。 使用i来表示当前遍历的位置: 当i = 0 时,显然,最长的递增序列为(1),则序列长度为1。...当前的递增子序列为(-1),长度为1。则LIS[1] = 1 当i = 2 时,由于2 > 1,2 > -1。因此,最长的递增子序列为(1, 2),(-1, 2),长度为2。则LIS[2] = 2。...当前的递增子序列为(-3),长度为1。则LIS[3] = 1。 依次类推之后,可以得出如下结论。...void FindLongestAscSequence(int *input,int size){ int *list = new int[size];// 用来存储以第i个元素结尾的最长递增子序列

    1.2K60
    领券