精华内容
下载资源
问答
  • 2022-03-14 17:11:18
    如果设置了id主键自增的话,编写插入语句不需要插入id值
    那么mysql的语句就变为:
    insert into table_name (字段名,字段名) value(插入值,插入值);
    
    更多相关内容
  • 虽然我们习惯于给主键ID指定AUTO_INCREMENT属性,但是AUTO_INCREMENT也是可以指定到...MySql 5.1之前的实现在这个版本之前,用AUTO_INCREMENT修饰的数据列确实是严格连续自增的。MySql的实现是会针对每个插入语句加...

    虽然我们习惯于给主键ID指定AUTO_INCREMENT属性,但是AUTO_INCREMENT也是可以指定到非主键字段的,唯一的约束就是这个字段上面得加索引,有了索引,就可以通过类似SELECT MAX(*ai_col*)的语句快速读到这列数据的最大值。

    MySql 5.1之前的实现

    在这个版本之前,用AUTO_INCREMENT修饰的数据列确实是严格连续自增的。MySql的实现是会针对每个插入语句加一个全表维度的锁,这个锁可以保证每次只有一条插入语句在执行,每插入一行数据,就会生成一个主键ID。

    mysql> CREATE TABLE t1 (

    -> c1 INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

    -> c2 CHAR(1)

    -> ) ENGINE=InnoDB AUTO_INCREMENT=100;

    假如我们在数据库中新建上面的这张表,接着我们执行插入语句。

    mysql> INSERT INTO t1 (c1,c2) VALUES (NULL,'a'), (NULL,'b'), (NULL,'c'), (NULL,'d');

    针对这条MySql执行的流程为:全表加 AUTO-INC锁

    1.1 生成主键ID:101

    1.2 将行(101, 'a')插入表中

    1.3 生成主键ID: 102

    1.4 将行(102, 'b')插入表中

    ...

    释放 AUTO-INC锁

    MySql5.1之前的这种实现方式可以保证AUTO_INCREMENT严格自增,但是并发程度也最差,因为AUTO_INCREMENT锁是全表加锁直到这条语句结束

    MySql 5.1版本带来的优化

    前文中的insert语句是比较简单的,所谓简单的insert语句指的是插入的的数据行数是可以提前确定的,与之相对的是Bulk insert比如INSERT ... SELECT这类语句,这类插入语句的插入行数不能提前确定。

    在这个版本以及之后,对于简单语句的插入,不再加全表的AUTO-INC锁,只会在产生自增列数据的时候加一个轻量级的互斥锁,等自增数据分配好,锁就释放了,因此像上面的例子,在MySql5.1之后的执行流程如下加轻量级互斥锁

    1.1 分配自增数据

    释放锁

    将行(101, 'a')插入表中

    将行(102, 'b')插入表中

    ...

    可以看到,对于简单的插入语句,并发情况下的临界区变小了,且不再持有全表的锁,提升了并发性能。当然,如果在尝试加锁的过程中遇到有其他事务持有全表的AUTO-INC锁,还是要等待全表的AUTO-INC锁释放再执行本次插入操作

    对于Bulk insert的插入语句,仍然避免不了全局的AUTO-INC锁,这类语句,他们的执行流程仍然保持和5.1之前版本一致,比如以下表为例

    CREATE TABLE t1 (

    c1 INT(11) NOT NULL AUTO_INCREMENT,

    c2 VARCHAR(10) DEFAULT NULL,

    PRIMARY KEY (c1)

    ) ENGINE=InnoDB;

    执行下面两条语句

    Tx1: INSERT INTO t1 (c2) SELECT 1000 rows from another table ...

    Tx2: INSERT INTO t1 (c2) VALUES ('xxx');

    由于在执行Tx1时,InnoDB无法知道要插入的具体行数,因此会获取一个全表的锁,每执行一条插入语句就会给自增列赋新的值。因为有全表的锁,所以Tx1这条语句插入的所有行数都是连续自增的,Tx2自增列的值要么小于Tx1自增列的最小值,要么大于Tx1自增列中的最大值,这取决于这两条语句的执行顺序

    InnoDB采取这样的决策一个重要的原因是主从复制,在MySql8.0之前,MySql的主从是基于语句复制的。在刚才的例子中,如果Tx1执行的时候没有全表的锁,那有可能在Tx1执行的过程中Tx2也在执行,这就会导致Tx1和Tx2自增列的数据每次执行结果都不相同,也就无法在从库中通过语句回放复制。

    MySql 8.0版本之后的优化

    虽然MySql5.1版本对简单的插入语句做了优化,避免了全表加锁,但对于INSERT ... SELECT这样的复杂插入语句,仍然避免不了全表的AUTO-INC锁,主要是基于执行语句的主从复制要能在从库完全回放复制主库,所有的语句执行结果就不能和执行顺序有关。

    在MySql 8.0以及之后默认的主从复制策略变成了基于数据行实现,在这样的背景下INSERT ... SELECT这样的复杂插入语句也不需要全表加锁来生成自增列数据了,所有的插入语句只有在生成自增列数据的时候要求持有一个轻量级的互斥锁,等到自增数据生成好之后释放锁。在这种实现下,所有插入语句的自增列都不能保证连续自增,但是并发性能确实最好的。

    总结

    需要说明的是,如果插入语句所处的事务回滚了,生成的自增列数据是不会回滚的,这种情况下会造成自增列数据非连续增长。

    以上所述都是各个MySql版本的默认实现,MySql 5.1引入了一个新的参数 InnoDB生成自增列的策略,其值总结如下:

    不推荐显式指定自增列数据,因为在5.7以及之前的版本,如果通过update语句显式指定一个比SELECT MAX(*ai_col*)还大的自增列值,后续insert语句可能会抛"Duplicate entry"错误,这一点在8.0版本之后也有了改变,如果通过显式的update语句显式指定一个比SELECT MAX(*ai_col*)还大的自增列值,那该值就会被持久化,后续的自增列值都从该值开始生成。

    假如有下面这张表

    mysql> CREATE TABLE t1 (

    -> c1 INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

    -> c2 CHAR(1)

    -> ) ENGINE = INNODB AUTO_INCREMENT=100;

    试想,在我们执行完下面这条语句之后表的内容变成了什么?

    mysql> INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');

    MySql 5.1之前,或者innodb_autoinc_lock_mode设置为0

    mysql> SELECT c1, c2 FROM t1 ORDER BY c2;

    +-----+------+| c1 | c2 |

    +-----+------+| 1 | a |

    | 101 | b |

    | 5 | c |

    | 102 | d |

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

    在这种模式下,每插入一行数据就会生成一个自增值赋到c1这一行,因此c1的下一个自增值是103

    MySql 8.0之前,或者innodb_autoinc_lock_mode设置为1

    mysql> SELECT c1, c2 FROM t1 ORDER BY c2;

    +-----+------+| c1 | c2 |

    +-----+------+| 1 | a |

    | 101 | b |

    | 5 | c |

    | 102 | d |

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

    当前表的数据与前一个场景一致,但是下一个自增值却是105,因为在这个场景下,自增数据是在插入语句执行的最开始一次性生成的

    MySql 8.0之后,或者innodb_autoinc_lock_mode设置为2

    mysql> SELECT c1, c2 FROM t1 ORDER BY c2;

    +-----+------+| c1 | c2 |

    +-----+------+| 1 | a |

    | x | b |

    | 5 | c |

    | y | d |

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

    在这种场景下,因为同时可能有其他的插入语句执行,因此x和y的值是不确定的,下一个自增值也是未知的。

    关注公众号【苦味代码】,分享更多后端技术细节

    展开全文
  • mysql设置非主键自增

    千次阅读 2021-02-02 04:02:23
    @GeneratedValue(strategy = GenerationType.IDENTITY) 根据底层数据库自动选择方式,需要底层数据库的设置 如 MySQL,会使用自增字段,需要将主键设置成 auto_increment......(8,2) 中文含义 存款流水号 客户标识 银行...

    @GeneratedValue(strategy = GenerationType.IDENTITY) 根据底层数据库自动选择方式,需要底层数据库的设置 如 MySQL,会使用自增字段,需要将主键设置成 auto_increment......

    (8,2) 中文含义 存款流水号 客户标识 银行标识 存入日期 存款期限 存款金额 枚举型,1,3,5 分别代表 1 年期、3 年期和 5 年期 主键,非空,自增 外键,......

    1. increment 自增,每次增长1,适用于所有数据库,但是不要使用多进程,逐渐类型必须是数值型 2.identity 必须使用数据库支持的一般 server sql ,mysql 支持 主键......

    取出sql表中第31到40的记录(以自动增长ID为主键)_计算机软件及应用_IT/计算机_专业资料。取出sql表中第31到40的记录(以自动增长ID为主键) sql server方案1: ......

    Oracle自动增长列的设置_IT/计算机_专业资料。SQL SERVER 和 ACCESS 以及 MYSQL 中, 都有一种自增字段, 通常被用来做主键或索引键, 但是 ORACLE 中,确并没有......

    6.2 插入操作返回自增主键的问题根据业务的需要,数据库插入操作有时候需要返回插入数据的 ID,并且执行插入的数据 库表的主键是自增的;在 Mysql 中的实现方式是,......

    A: 设置数据库自增主键的起始值语法为:ALTER TABLE 表名 AUTO_...

    mysql查询语句练习题 Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 ......

    MySQL 数据库之 UPDATE 更新语句精解 (1) 用于操作数据库的 SQ...

    alter添加主键 alter table temp add primary key(name, pwd); --alter修改列为主键 alter table temp modify id int primary key; --设置主键自增 cr......

    设置主键自增 create table temp( id int auto_in...

    主键、外键、唯一、默认、非空 4. MySQL 配置文件 my.ini 常用的参...

    (4) 非空 主键,自增 1 2 title 标题 varchar(32) 非空...

    修改student表中的主键为自增机制 3. 修改学生的sage字段名称为age...

    设置主键自增 create table temp( id int auto_in...

    主键,自增列 学生名称,非空 年龄,非空 学生性别,非空 课程表:course 字段名 cid cName tid 数据类型 int(4) varchar (50) int(4) 说明 课程编号,主键 ......

    设置主键自增 create table temp( id int auto_in...

    在example数据库创建一个student表和一个grade表,表结构如下图所示 Student表 字段名 字段描 数据类型 主键 外键 非空 唯一 自增 述 Num Name Sex 学号 姓名 ......

    identity 对 DB2,MySQL, MS SQL Server,Sybase 和 HypersonicSQL 的内置标识字段提供支持。 返回 的标识符是 long, short 或者 int 类型的。 (数据库自增) ......

    一般情况下无符号int类型的字段几乎 可以满足系统要求了,就算是自增id类型。40多亿的mysql数据量也已经比较不 小了。日交易量记录上千万比记录,一个月也就区区3......

    展开全文
  • Mysql 主键自增插入数据问题

    千次阅读 2021-01-18 18:57:40
    MySQL数据库表中有自增主键ID,当用SQL插入语句中插入语句带有ID列值记录的时候;如果指定了该列的值,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值;也可以不指定该列的值,只将其他列的值插入,...

    MySQL数据库表中有自增主键ID,当用SQL插入语句中插入语句带有ID列值记录的时候;

    如果指定了该列的值,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值;

    也可以不指定该列的值,只将其他列的值插入,让ID还是按照MySQL自增自己填;

    具体:

    1.创建数据库

    create table if not exists userInfo (

    id int PRIMARY KEY AUTO_INCREMENT,

    name varchar(50) NOT NULL,

    password varchar(50) NOT NULL

    );

    1

    2

    3

    4

    5

    2.插入数据记录

    insert into userInfo values(1,'aaa','1212');

    1

    当数据表中有自增长主键时,当用SQL插入语句中插入语句带有ID列值记录的时候;

    如果指定了该列的值,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值;

    也可以不指定该列的值,只将其他列的值插入,让ID还是按照MySQL自增自己填;

    这种情况在进行插入的时候,两种解决方法:

    ①可以把id的值设置为null或者0,这样子mysql都会自己做处理

    ②手动指定需要插入的列,不插入这一个字段的数据!

    #方法①:

    insert into userInfo values(null,'ddf','8979');

    insert into userInfo values(0,'ddf','8979');

    1

    2

    3

    #方法②:

    insert into userInfo(name,password) values('ddf','8979');

    展开全文
  • MySQL为什么主键自增

    2021-02-03 13:36:11
    mysql主键自增的原因:1、数据记录本身被存于主索引的叶子节点上;2、mysql会根据其主键将其插入适当的节点和位置;3、表使用自增主键,在每次插入新的记录时,记录会顺序添加到当前索引节点的后续位置。MySQL之所以...
  • oracle和mysql插入数据主键自增的方法 mysql插入数据时,只要在navcat勾上主键的自动递增,那么它在插入数据时就会自动增加。 在插入的时候sql语句: < insert id="insertToSysUser" useGeneratedKeys="true" ...
  • mysql 主键自增

    2021-09-06 16:29:35
    当前主键自增到33了。但下一条数据想让它主键为50,跳过中间的差值。我想当然的认为只要将当前的主键33改为50,那么它的最大主键就是50,之后插入数据就会接着50继续自增。但实际上新插入数据仍然是接着33开始自增...
  • } @Test void testUpdate(){ } } 当上述程序不采用自增的时候,就可以插入数据不报错,但是采用自增的情况下就会报错 数据库也设置了主键自增功能 结果: ![img]...
  • 联合主键自增问题今天上午闲来无事翻看了下数据库分类表的设计,看到这样一幕:当时我好奇的是怎么cateId自增会存在重复值的问题,然后翻看了下主键是由siteId和cateId组成。所以进行了查阅资料:当多列组成联合...
  • 如何获取 MySQL 插入数据自增 ID

    千次阅读 2020-06-29 09:48:00
    作者:学无止境来源:https://www.cnblogs.com/duanxz/p/3862356.html前言mysql和oracle插入的时候有一个很大的区别是,oracle支持序...
  • MyBatis 3.2.6插入时候获取自增主键方法有两种,下面以以MySQL5.5为例通过两种方法给大家介绍mybatis获取自增主键的方法,一起看看吧
  • 一、MySql数据库当向数据库中插入一条数据的时候,默认是拿不到自增主键的值的, 需要设置如下两个属性才可以拿到主键值!设置userGeneratedKeys属性值为true:使用自动增长的主键。使用keyProperty设置把主键值设置...
  • 在将数据库从MSSQL迁移到MySQL的过程中,基于业务逻辑的要求,需要在MySQL自增插入0值。在MSSQL中是这样完成的: 代码如下: string sql;sql = ” set identity_insert dbo.AppUsers on ” + ” insert dbo....
  • 我们直接向表中添加自增的非主键字段时会报错: Invalid Default Value For “id” 我们可以这样做: (1)为该字段添加任意key:  alter table user ADD KEY test(id) // test为任意的key名称 (2)将该字段修改...
  • Mysql主键自增字段

    千次阅读 2020-07-06 10:21:34
    Mysql主键自增字段需求错误的方式正确的方式原因分析 需求 菜单表涉及到人为干预排序,设计表结构时,需要单独的字段(seq)用于排序。此字段仅用于排序,非主键字段。 错误的方式 SET NAMES utf8mb4; SET FOREIGN...
  • MySQL主键设置自增

    2021-04-19 14:13:14
    有个需求:需要给数据列表添加一个序号(序号为1、2、3....),需要自增 alter table table_name add num(序号) int auto_increment not null Unique; 需加unique才能设置自增成功,否则会报错 Incorrect table ...
  • 1 建立表格 CREATE TABLE `tables_a` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` char(50) DEFAULT NULL, ... 4 调用存储过程[此处的4作用不大,只是用来计算插入条数(9-4)] CALL test(4,9,5) 5 显示结果
  • 查看配置 show variables like '%increment%'; 如果: auto_increment_increment=2 执行:set @@global.auto_increment_increment = 1; set @@auto_increment_increment =1; 再查看 ...auto_increment_offset=2 ...
  • 讲述背景,项目分库,一些数据统计后同步到另一个数据库中去,就需要批量插入或者更新 但是,发现主键ID会跳码。 一点点的断点,发现两个数据库有一个字段的长度不一样,导致批量插入的时候插入占据了ID,但是插入...
  • mysql 插入数据并返回自增主键和非自增主键的方式 MyBatis的insert操作,如何在插入数据的同时返回主键呢?分为两种情况,一种情况是该主键自增主键,另一种情况是该主键自增,接下来对两种情况详细解释。 mysql...
  • MYSQL插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 1、使用last_...
  • 文章目录 环境 前言 解决方案 环境 MyBatis-Plus MySQL 5.7 前言 最近因业务需要,需要在一张主键自增的表里使用 SQL 插入数据,表结构如下: CREATE TABLE non_inc ( id BIGINT NOT NULL PRIMARY KEY -- 其他字段...
  • SQL Server 2008 数据库主键自增插入显示值 前几天在工作的时候遇到在删除数据库中表的数据的时候,删除之后,重新添加的数据没有得到原来的数据的id值(表中id为主键,且设置为自增) ,使用的是SQL Server 2008 ,...
  • MySQL 自增主键

    千次阅读 2022-02-10 17:46:23
    ​ 在创建主键的时候可以使用AUTO_INCREMENT关键字进行自增主键设置,设置之后,每插入一条数据之后主键都会自动累加1 ​ 使用AUTO_INCREMENT=100可以在表级别设定偏移量,比如这里设定为100,即从100开始累加 2、...
  • Mybatis 插入一条数据返回主键自增

    千次阅读 2022-02-21 11:28:49
    Mybatis 原来一般插入一条数据就这样 <insert id="add" parameterType="com.pojo.CheckGroup"> insert into checkgroup (id,code,name,sex,remark,attention) values (#{id},#{code},#{name},#{sex},#{...
  • Mysql 自增主键

    2021-05-30 18:51:55
    整型结合属性 auto_increment,可以实现自增功能,但在表结构设计时用自增主键,希望你特别要注意以下两点,若不注意,可能会对业务造成灾难性的打击: 用 BIGINT 做主键,而不是 INT; 自增值并不持久化,可能会...
  • 1、pom <artifactId>mybatis <groupId>org.mybatis <version>3.3.1 <groupId>org.mybatis <artifactId>mybatis-spring ...以上三步可实现批量插入返回数据主键

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,893
精华内容 22,357
关键字:

mysql插入数据主键自增

mysql 订阅