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

mysql 主键语句_MySQL 主键

主键有两个性质需要考虑: 单调性 每次插入数据,其 ID 都是比上条插入的数据的 ID 大,就算上数据被删除。...连续性 插入成功时,其数据的 ID 和前次插入成功时数据的 ID 相邻。 主键的单调性 为何会有单调性的问题? 这主要跟主键最大值的获取方式,以及存放位置有关系。...MySQL 5.7 及之前的版本,主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...问题在于如果有其他表依赖了该 ID,则其他表的数据关联到的数据就符合要求了。除非设置了外键。 比如我要向最大个 ID 的账号充了 100 万。...批量插入中的部分的 ID 是指定的(非 0 且非 NULL),另部分未指定,使用数据库生成的 ID。

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

    mysql主键策略_MySQL 主键机制

    对于MyISAM引擎,增值保存在数据文件中; b. Innodb引擎,mysql5.7之前,增值保存在内存中,而且不会持久化增值。...每次重启后第次打开表,都会去查找增值的最大值max(id), 并设置表当前增值为max(id) + 1; mysql8.0, 增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...增值修改发生在插入数据的操作之前,如果插入失败,增值不会再修改回去; b. 事务回滚也不会将自增值修改回去; c. 为了减少id锁带来的性能影响,mysql不会修改回去之前的增值; 4....次性insert多条记录时,如果能计算出需要多少个id,就次性申请,申请完就释放; c. insert … select 默认会使用语句级的锁,只有语句执行完才会释放锁,为了数据致性; d....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL个批量申请 id 的策略(注:该策略是导致 id 不连续的第三种原因

    9.4K50

    数据库中设置列字段(Oracle和Mysql

    oracle 1、创建个序列,然后在需要的字段里使用它 drop sequence seq_stu create sequence seq_stu start with 22 Increment...by 1 maxvalue 999 nocache nocycle; --这是最详细的种序列的创建,指定了序列从22开始,到999结束,每次使用后都1 create sequence seq_stu...--这是最简单的种序列的创建方式,指定了序列从1开始,每次使用后都1 drop sequence seq_stu; --删除序列(seq_stu为序列名) 2、数据的插入(序列名.nextval...表名; 注意:截断表,即删除所有数据,只保留表结构 Mysql 创建表时直接制定增列/字段 1、通过点击点击相关表选择“设计表”进行设置 ?...TRUNCATE TABLE 表名; 注意:会删除表中的数据,只有在MySQL中,TABLE字段可省略

    7.2K20

    Oracle 设置ID

    start with 21 increment by 1 cache 20; 参数描述: create sequence seq_name:创建序列,seq_name为序列名称 minvalue:最小值...maxvalue:最大值,缺省值为nomaxvalue,即不设置最大值;系统能产生的最大值为10的27次方。 start with:增开始值,设置成21则从21开始自。...increment by:数值,设置成1则每次递增1,负数表示递减,缺省值为1。...cache:定义缓存序列的个数,缺省值为20,nocache表示不设置缓存;使用缓存可以提高序列的性能,但数据库出错时会造成数据丢失使序列不连续。...into :new.user_id from dual; end t_user_tr; 参数描述: t_user_tr: 随意的名字,不要重复就行 t_user: 表名 user_id :的id

    77530

    浅谈MySQL

    ()函数可以获得最后个插入的数字 select last_insert_id(); 五、锁 如果存在字段,MySQL会维护锁,和锁相关的个参数为(5.1.22版本之后加入) innodb_autoinc_lock_mode...(不会锁表,来个处理个,并发最高) ps:这个参数值控制InnoDB引擎的设置,所有Myisam均为traditonal,每次均会进行表锁。...第二种,插入已经有值的 1、插入第数据 2、如果失败流程结束 3、如果成功,申请AUTO_INC锁 4、调用set_max函数,修改AUTO_INCREMENT 5、语句结束,释放AUTO_INC...=1也会退化回0,这是因为为了保证数据致性。...为了保证主库和从库的ID的致性,binlog中会有set insert_ID命令,标明这个load语句的第行的ID值,这样在表锁的情况下,就可以保证致性了。

    5K30

    MySQL主键定是连续

    但实际上,MySQL主键并不能保证定是连续递增的。...更遗憾的是,即使在初始值和步长这两个参数都设置为 1 的时候,主键 id 也不定能保证主键是连续的 增值不连续场景 2 举个例子,我们现在往表里插入条 (null,1,1) 的记录,生成的主键是...至此,我们已经罗列了两种主键不连续的情况: 初始值和步长设置不为 1 唯键冲突 除此之外,事务回滚也会导致这种情况 增值不连续场景 3 我们现在表里有行 (1,1,1) 的记录,AUTO_INCREMENT...增值不连续场景 4 对于批量插入数据的语句,MySQL个批量申请 id 的策略: 语句执行过程中,第次申请 id,会分配 1 个; 1 个用完以后,这个语句第二次申请 id,会分配...之后,再执行 insert into test_pk2 values(null,6,6),实际上插入的数据就是(8,6,6): 小结 总结下自增值不连续的四个场景: 初始值和步长设置不为 1

    3.8K10

    MySQL锁的探究

    2.5 MySQL锁是指在使用主键(Auto Increment)时,为了保证唯性和正确性,系统会对字段进行加锁。这样可以确保同时插入多条记录时,每条记录都能够获得唯增值。...2.5.1 表的插入数据方式我们之前在表中插入数据都是用最基本的insert,但insert语句的用法用很多,另外MySQL还提供replace语句,允许对表中的数据进行替换;insert用法:drop...(但不是全部)新行指定自动增量值2.5.2 锁原理1)插入原理MySQL锁的实现机制是使用了个名为"auto-increment lock"的互斥锁。...当使用INSERT语句插入条新记录时,MySQL会自动为字段加锁,防止其他并发的插入操作同时获取相同的增值。这个锁是在内部实现的,不需要用户手动创建或管理。...;2.5.4 步长控制般我们在创建表的时候id起始值为1,通过AUTO_INCREMENT可以设置其值;drop table if exists t3;CREATE TABLE `t3` (

    10421

    深入剖析 MySQL

    什么是锁 之前我们提到过,锁是种比较特殊的表级锁。...并且在事务向包含了 AUTO_INCREMENT 列的表中新增数据时就会去持有锁,假设事务 A 正在做这个操作,如果另个事务 B 尝试执行 INSERT语句,事务 B 会被阻塞住,直到事务 A 释放锁...并且,锁还有个限制,那就是被设置为 AUTO_INCREMENT 的列必须是索引,或者该列是索引的部分(联合索引),不过这个限制对于大部分开发场景下并没有什么影响。...Binlog 般用于 MySQL数据复制,通俗点就是用于主从同步。...换句话说,如果你的 DB 有主从同步,并且 Binlog 存储格式为 Statement,那么不要将 InnoDB 锁模式设置为交叉模式,会有问题。

    3.3K40

    关于 MySQL字段

    因为MySQL中的字段与Oracle数据库是不样的,所以在这里记录MySQL字段。...中字段必须为主键,否则会出现下错误提示 create table emp( empno int(5) auto_increment ); 0 33 15:20:54 create table emp...Incorrect table definition; there can be only one auto column and it must be defined as a key 0.000 sec 2.设置的起始值...在mysql字段的起始自增值为1,但有时候我们并不是要求从1开始自,这时需要我们的手动设置。...alter table emp auto_increment=100; 注意:在创建表后再设置增值的情况下,如果在设置之前就已经插入了数据的话,然后再插入数据,在数据库中的数据是不会改变的,但是这样操作会造成数据插不进去的情况

    3.5K20

    深入剖析 MySQL

    什么是锁 之前我们提到过,锁是种比较特殊的表级锁。...并且在事务向包含了 AUTO_INCREMENT 列的表中新增数据时就会去持有锁,假设事务 A 正在做这个操作,如果另个事务 B 尝试执行 INSERT语句,事务 B 会被阻塞住,直到事务 A 释放锁...并且,锁还有个限制,那就是被设置为 AUTO_INCREMENT 的列必须是索引,或者该列是索引的部分(联合索引),不过这个限制对于大部分开发场景下并没有什么影响。...Binlog 般用于 MySQL数据复制,通俗点就是用于主从同步。...换句话说,如果你的 DB 有主从同步,并且 Binlog 存储格式为 Statement,那么不要将 InnoDB 锁模式设置为交叉模式,会有问题。

    3K20

    MySQL主键值回溯问题

    平时我们使用MySQL时,通常每个表都会有主键ID,每新增数据,ID值就会1。但在8.0之前版本的MySQL中,这个增值会存在个回溯的问题。...例如,在个新表中插入三条主键为1、2、3的数据行,这时候用SHOW CREATE TABLE命令查看该表的AUTO_INCREMENT的值是4,这是没问题的。...然后把ID=3的数据行删掉,再次查询AUTO_INCREMENT的值,依然是4,这也是没问题的。 但如果重启MySQL,这个值就会变回3,而不是4,发生了回溯。...这是因为AUTO_INCREMENT的值只存储于内存中,不会持久化到磁盘,每次启动数据库时,MySQL会通过计算max(auto_increment字段) + 1,重新作为该表下次的主键ID的增值。...这个问题直至MySQL 8.0才修复。 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149188.html原文链接:https://javaforall.cn

    4.1K20

    MySQL 主键注意事项

    很多小伙伴应该知道,在 MySQL 中主键不应该使用随机字符串。但是主键不用随机字符串用什么?主键?主键就是最佳方案吗?有没有其他坑?今天我们就来讨论下这个话题。 1....为什么不用 UUID 经过上篇文章的介绍,我们知道在 MySQL 中,主键索引就是聚簇索引,MySQL 表中的数据是根据主键值聚集在起的,聚簇索引是棵 B+Tree,这棵树中的数据是有序的。...基于上面的分析,我们在 MySQL 中尽量不使用 UUID 作为主键,不用 UUID,可能会有小伙伴想到,那我使用主键行不行?...主键有没有些需要注意的问题? 2. 主键的问题 以下内容,有个共同的大前提,就是我们的表设置了主键般来说,主键是没有什么问题的。但是,如果在高并发环境下,就会有问题了。...ON DUPLICATE KEY UPDATE 也算是种 mixed insert。 将数据插入分为这三类,主要是因为在主键的时候,锁的处理方案不同,我们继续往下看。

    9110

    MySQL主键详解「建议收藏」

    出现了主键不连续的情况 唯键冲突和事务回滚都会导致主键id不连续的情况 四、锁的优化 id锁并不是个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请 但在MySQL5.0版本的时候...也就是说,如果个语句申请了个表锁,这个锁会等语句执行结束以后才释放 MySQL5.1.22版本引入了个新策略,新增参数innodb_autoinc_lock_mode,默认值是1 1.这个参数设置为...0,表示采用之前MySQL5.0版本的策略,即语句执行结束后才释放锁 2.这个参数设置为1 普通insert语句,锁在申请之后就马上释放 类似insert … select这样的批量插入数据的语句,...锁还是要等语句结束后才被释放 3.这个参数设置为2,所有的申请主键的动作都是申请后就释放锁 为了数据致性,默认设置为1 如果sessionB申请了增值以后马上就释放锁,那么就可能出现这样的情况...对于批量插入数据的语句,MySQL个批量申请id的策略: 1.语句执行过程中,第次申请id,会分配1个 2.1个用完以后,这个语句第二次申请id,会分配2个 3.2个用完以后,还是这个语句

    5.9K40
    领券