SQL第5/n篇(更新中)自增长列与事务

作者: 粉红狐狸_dhf | 来源:发表于2020-07-28 15:17 被阅读0次

    标识列

    又称“自增长列"

    特点:
    1、自增长列必须和主键搭配吗?
        不一定,但必须是一个key,(如:unique,primary key,foreign key)
    2、一个表中可以有多少个标识列?
        至多一个
    3、标识列的类型有没有限制?
        只能是数值型,一般是int ,(float,double也可以)
    4、标识列设置步长的方式:SET auto_increment_increment = 3;
       也可以通过手动插入起始值,更改起始索引。
    

    一、创建表时加自增长列

    创建表

    CREATE TABLE tab_identity(
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20)
    );
    INSERT INTO tab_identity VALUES (NULL,'Pinkfox');
    INSERT INTO tab_identity (NAME) VALUES ('Pink');
    SELECT * FROM tab_identity;
    

    更改步长

    SHOW VARIABLES LIKE '%auto_increment%';
    #auto_increment_increment 步长
    #auto_increment_offset 起始值,但在mysql中不起作用
    SET auto_increment_increment = 3;
    
    INSERT INTO tab_identity VALUES (NULL,'Pinkfox');
    INSERT INTO tab_identity (NAME) VALUES ('Pink');
    INSERT INTO tab_identity (NAME) VALUES ('fox');
    SELECT * FROM tab_identity;
    
    步长=3.png

    要想更改起始值,可以手动插入第一个值,然后再auto_increment

    TRUNCATE TABLE tab_identity;
    INSERT INTO tab_identity VALUES (5,'Pinkfox');
    INSERT INTO tab_identity (NAME) VALUES ('Pink');
    INSERT INTO tab_identity (NAME) VALUES ('fox');
    SELECT * FROM tab_identity;
    
    设置起始值为5.png

    二、修改表时添加标识列

    DROP TABLE IF EXISTS tab_identity;
    CREATE TABLE tab_identity(
        id INT ,
        NAME VARCHAR(20)
    );
    

    修改表

    ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
    DESC tab_identity;
    
    修改表时添加标识列.png

    三、修改表时删除标识列

    ALTER TABLE tab_identity MODIFY COLUMN id INT ;
    DESC tab_identity;
    
    修改表时删除标识列.png

    TCL

    Transaction Control Language 事物控制语言

    事务: 
      一个或者一组sql语句组成的执行单元,这个单元要么全部执行,要么全部不执行
    

    案例:转账
    我有1000块,你有1000块,你转给我500.
    此时要么全部执行,我1500,你5000;要么执行失败,我1000,你1000.

    update table 表 set 总额=1500 where name = '我'
    意外
    update table 表 set 总额=500 where name= '你'

    我们希望这个事务要么全部执行,要不全部不执行,不希望,有我给你转了钱,你没收到的情况发生。

    事务的特性ACID
      1、原子性atomicity:不可再分
      2、一致性consistency:执行前后状态一致,总额还是2000
      3、隔离性isolation:互不影响
      4、永久性durability:一旦提交事务,改变将是不可逆的,永久的
    
    事务的创建:
    1、显式事务
        insert update delete 
    2、隐式事务:事务具有明显的开启和结束标记
        前提:必须先设置自动提交功能为禁用
        set autocommit = 0;
    
    步骤1:开启事务
    set autocommit = 0;
    start transaction; #可选的
    步骤2:编写事务中的sql语句(select insert update delete)
    语句1;
    语句2;
    ……
        savepoint 回滚点名;   #设置保存点
    
    步骤3:结束事务
    commit;#提交事务
    rollback;#回滚事务(就是撤销操作,回到之前的状态)
    rollback to 回滚点名;
    
    SHOW VARIABLES LIKE '%autocommit%';
    SHOW ENGINES;#有的是不支持事务的,默认InnoDB ,它是支持事务的。
    

    1、演示事务的使用步骤

    DROP TABLE IF EXISTS book;
    CREATE TABLE book(
        id INT PRIMARY KEY AUTO_INCREMENT,
        bname VARCHAR(20),
        price INT,
        authorid INT
        
    );
    INSERT INTO book VALUES(NULL,'story',25,1);
    INSERT INTO book VALUES(NULL,'aaa',15,2);
    SELECT * FROM book;
     
    SHOW VARIABLES LIKE 'character%';
    
    #开启事务
    SET autocommit = 0;
    START TRANSACTION;
    #编写一组事务语句
    UPDATE book SET price = 30 WHERE bName = 'story';
    UPDATE book SET price = 40 WHERE bName = 'aaa';
    #结束事务
    COMMIT;
    

    事务的并发问题:

    同时运行多个事务,且这些事务访问相同数据时,如果没有隔离机制,就会导致并发问题。
    1、脏读:T1读取了已经被T2更新但没有被提交的字段,若T2回滚,则T1读到的是临时无效的数据。
    例如:微信发消息,我给撤回了,撤回之前你看到的都是无效的
    2、不可重复读(只能读一遍,在读就不一样了):T2回滚,导致两次看到的T1字段不一样。
    3、幻读:T2的插入(删除)还没提交时,导致两次的T1不一样。
    与脏读的区别在于:脏读发生在更新时,幻读发生在插入和删除时。

    ( 事务的并发事件,通过控制端口进行演示,这就不写了。)

    总结一下命令:

    1.查看当前隔离级别: select @@tx_isolation;
    mysql默认的并不是最高的隔离级别,仍可能发生幻读现象。但是避免了脏读和不可重复读

    2.设置当前的隔离级别:
    set session transaction isolation level 隔离级别;

    3.设置数据库系统的全局隔离级别:
    set global transaction isolation level 隔离级别;
    因为每启动一个mysql程序,就会获得单独的一个数据库连接。每个数据库连接都有一个全局变量@@tx_isolation,表示当前事务的隔离级别。

    4.事务的隔离级别:

                                     脏读      不可重复读      幻读
     read uncommitted:                 ×           ×            ×
     read committed(oracle默认):      √           ×            ×
     repeatable read(mysql默认):      √           √            ×
     serializable 串行化:                     √           √            √
    

    √:表示已解决的问题。


    事务的隔离级别.png

    2 delete和truncate在事务中的区别

    事务中包含的是delete语句,最后回滚,原来的数据还存在;
    事务中包含的是truncate语句,最后回滚,原来的数据就不存在了。

    相关文章

      网友评论

        本文标题:SQL第5/n篇(更新中)自增长列与事务

        本文链接:https://www.haomeiwen.com/subject/gzmfrktx.html