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