zoukankan      html  css  js  c++  java
  • MYSQL培训准备(2):MYSQL自增长陷阱

        MYSQL中,在数据库中创建表的语法如下:

    1 CREATE TABLE tablename(
    2 column_name_1 column_type_1 constraints,
    3 column_name_2 column_type_2 constraints,
    4 ...
    5 column_name_n column_type_n constraints,
    6 PRIMARY KEY (column_name)
    7 );

        其中,tablename为表名,column_name为列名,column_type为列的数据类型,constraints为相关的约束条件。在所有的约束条件中,有一个AUTO_INCREMENT的条件,表示自增长列,根据设置的步长自动增长。

        今天我们聊聊MYSQL中的自增长列。
        在MS SQL SERVER中,我们知道自增长列是严格按照步长实现自动增长。而MYSQL中却有个则增长的陷阱。对于单条记录,一条一条insert into,确实是自增长的。但如果我们批量插入,自增长列就不是连续的。请看下面实例。

        首先,我们创建一张部门表,语句如下:

    CREATE TABLE `ivr`.`t_dept` (
      `f_id` INT Not NULL AUTO_INCREMENT,
      `f_areaid` INT NULL,
      `f_dept` VARCHAR(45) NULL,
      PRIMARY KEY (`f_id`));
    

        当我们逐条插入数据时,自增长列是连续的。如下:

    insert into t_dept(f_areaid,f_dept) values(2,'网优' );
    insert into t_dept(f_areaid,f_dept) values(2,'传输' );
    insert into t_dept(f_areaid,f_dept) select 2,'数据'; 
    insert into t_dept(f_areaid,f_dept) select 2,'家宽'; 
    

        查询结果如下:

    mysql> select * from t_dept;
    +------+----------+--------+
    | f_id | f_areaid | f_dept |
    +------+----------+--------+
    |    1 |        2 | 网优   |
    |    2 |        2 | 传输   |
    |    3 |        2 | 数据   |
    |    4 |        2 | 家宽   |
    +------+----------+--------+
    4 rows in set (0.00 sec)
    

        当我们批量插入时,问题就出现了,请看下面:

    insert into t_dept(f_areaid,f_dept) 
    select 3,'网优' 
    union
    select 3,'传输'; 
    

        结果如下:

    mysql> select * from t_dept;
    +------+----------+--------+
    | f_id | f_areaid | f_dept |
    +------+----------+--------+
    |    1 |        2 | 网优   |
    |    2 |        2 | 传输   |
    |    3 |        2 | 数据   |
    |    4 |        2 | 家宽   |
    |    5 |        3 | 网优   |
    |    6 |        3 | 传输   |
    +------+----------+--------+
    6 rows in set (0.00 sec)
    

        此时f_id还是连续的。当我们再插入记录时,问题出现的。

    insert into t_dept(f_areaid,f_dept) 
    select 3,'数据' 
    union
    select 3,'家宽' ;
    

        我们再看结果,7不见了:

    mysql> select * from t_dept;
    +------+----------+--------+
    | f_id | f_areaid | f_dept |
    +------+----------+--------+
    |    1 |        2 | 网优   |
    |    2 |        2 | 传输   |
    |    3 |        2 | 数据   |
    |    4 |        2 | 家宽   |
    |    5 |        3 | 网优   |
    |    6 |        3 | 传输   |
    |    8 |        3 | 数据   |
    |    9 |        3 | 家宽   |
    +------+----------+--------+
    8 rows in set (0.00 sec)
    

        为什么会出现这种情况呢,我查看了手册,MYSQL中,自增长列只保证字段的唯一性。当批量插入n条记录时,MYSQL需要n-1条记录缓存,此时会默认为插入了2n-1条记录,从而造成了记录的不连续性。

  • 相关阅读:
    APP版本更新通知流程测试要点
    Android+appium +python 点击坐标tap方法的封装
    appium 元素定位find_element_by_android_uiautomator方法使用
    Android 应用加固(乐固)操作说明
    查询APP Store已发布过的版本记录
    appium 报错:AttributeError:"NoneType' object has no attribute 'XXX'
    appium 运行报错:...... Attempt to re-install io.appium.settings without first uninstalling解决方案
    Charles模拟网络请求页面的网络超时测试
    利用漏洞中验证码绕过的小技巧
    C中的volatile用法
  • 原文地址:https://www.cnblogs.com/haoge520/p/7216975.html
Copyright © 2011-2022 走看看