一.标识列
标识列有点类似前文的约束。
又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值
使用方法在插入的列后面 添加关键字 AUTO_INCREMENT
特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key
2、一个表可以有几个标识列?至多一个!
3、标识列的类型只能是数值型
4、标识列可以通过 SET auto_increment_increment=3;设置步长
可以通过 手动插入值,设置起始值
#1、创建表时设置标识列
在插入的列后面 添加关键字 AUTO_INCREMENT
DROp TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT ,#自动增长必须搭配key
NAME VARCHAR(10)
);
INSERT INTO tab_identity(id,NAME) VALUES(1,'yudengwu');
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');
SELECT * FROM tab_identity;
结果 ID2 和ID3 是自动增长的
自动增长的插入时可以写null,可以不写
#2、修改自动增长步长
#查看
SHOW VARIABLES LIKE '%auto_increment%';
默认为1
第一个为步长,第二个为起始值,起始值不支持值
修改步长
SET auto_increment_increment=3;
重新插入数据
SHOW VARIABLES LIKE '%auto_increment%';
SET auto_increment_increment=3;
DROp TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT ,
NAME VARCHAR(10)
);
INSERT INTO tab_identity(id,NAME) VALUES(1,'yudengwu');
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');
SELECT * FROM tab_identity;
#3、修改表时设置标识列
ALTER TABLE 表名 MODIFY COLUMN 列名 INT 键 AUTO_INCREMENT;#
ALTER TABLE tab_identity MODIFY COLUMN id INT UNIQUE AUTO_INCREMENT;#设置唯一键
#四、修改表时删除标识列
直接去掉标识列语法
ALTER TABLE 表名 MODIFY COLUMN 列名 INT ;#
二.事务
1.事务的介绍
#TCL
/*
Transaction Control Language 事务控制语言
事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
案例解释事务
假设 余总有100万元,余总的女朋友有30万元。今天是情人节,余总要转账520元给 余总的女朋友。
伪代码如下:
update 表 set 余总的余额=999480 where name=‘余总’;
update 表 set 余总女朋友的余额=300520 where name=‘余总女朋友’;
假设在执行时出现意外,只执行啦第一条语句,第二条收账语句未执行。
而事务就是保障 这两条语句要么全执行,要么全部执行。
不会出现,这边转账啦,那边收不到。
事务的特性:
ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据.
2.事务的创建
隐式事务
隐式事务:事务没有明显的开启和结束的标记
比如insert、update、delete语句
如下面一条语句就是一个事务、
delete from 表 where id =1;
SHOW VARIABLES LIKE 'autocommit';
可以发现自动提交是开启的
显式事务
隐式事务有时候不好,比如我们需要的是两条update语句。这时候就需要显示事务啦。
显式事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit=0;
步骤1:开启事务
set autocommit=0;
start transaction;可选的
步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
…
步骤3:结束事务
commit;提交事务
rollback;回滚事务
savepoint 节点名;设置保存点
事务开启演示:
DROP TABLE IF EXISTS account;
#创建表
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10),
balance FLOAT
);
INSERT INTO account(username ,balance)VALUES ('余总',1000),('余总女友',1000);
#做下转账事务
#第一步开启事务
SET autocommit=0;
START TRANSACTION;#可选的
#编写事务的语句
UPDATE account SET balance=500 WHERe username='余总';
UPDATE account SET balance=1500 WHERe username='余总女友';
#结束事务
COMMIT;#提交事务
SELECT * FROM account;
回滚演示下
#创建表
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10),
balance FLOAT
);
INSERT INTO account(username ,balance)VALUES ('余总',1000),('余总女友',1000);
#做下转账事务
#第一步开启事务
SET autocommit=0;
START TRANSACTION;#可选的
#编写事务的语句
UPDATe account SET balance=1000 WHERe username='余总';
UPDATE account SET balance=1000 WHERe username='余总女友';
#结束事务
ROLLBACK;#回滚事务
SELECT * FROM account;
在新的例子中设置金额为1000,结果还是显示500,1500,未改变
回滚如同在下载安装文件时,在最后一步安装时选择撤销。
3.事务的并发性问题
脏读:如余总给余总女友转账10万块钱,已经转啦,但余总女友还未点击收账,此时点击撤销10万块钱,则女友看到的转账信息就是无效的,这就是脏读。
不可重复读:在脏读的基础上,余总女友第一次查看转账信息是10万块钱,但是由于余总撤销啦,第二次查看信息为转账0元。
幻读:有一次余总想请余总女友和她室友吃饭,他兜里只有100元钱,于是他和她们就出去啦,过啦一会儿由来啦几个她的室友…。他兜里只有100元钱。
4.如何避免事务的并发性问题
算例1:隔离级别 read uncommitted ,读取未提交数据
1.>select @@tx_isolation;#查看当前支持隔离级别
set session transaction isolation level read uncommitted;#将隔离级别设置为最低,读未提交
2.先开一个事务1,该事务没有提交
3.新建一个命令行,新的命令行颜色改为绿色
4.开新事务2
5.在查看中发现已经把余总改为啦john,但事务一还未提交。这个读到的数据称为脏数据
6.任务1回滚
7.再次查看事务2的数据,余总又回来啦。John未再出现,这也叫不可重复读。
8.提交事务1 ,事务2.
算例2:隔离级别 read committed; 读取已提交数据
set session transaction isolation level read committed; #读已提交
1.在黑色命令行里修改隔离级别为读已提交
2.开启事务1,事务1并未结束
3.开启事务2,事务2隔离级别改为相应的
set session transaction isolation level read committed;
4.查看,发现 ID=1 的数未改成高念。
上面read committed;例子避免啦脏读,但不可重复读和幻读没有避免。
5.任务1提交
6.查看任务2
ID=1 变啦。
7.提交事务2.
算例3:隔离级别 repeatable read; 可重复性读
set session transaction isolation level repeatable read;
1.设置隔离级别
-
事务1开启,查看原始数据,将ID=1 的名字改为杨幂,未提交。
-
在事务2 查看,发现id=1并未改变.没有出现脏读
4.事务1提交
5.再次查看事务2
id=1并未改变成杨幂,实现重复读功能。
6.提交事务2 ,再次查看
ID=1 变啦
第三个可以解决脏读和不可重读,幻读不能解决。
算例4:幻读演示;
1.开启事务1,事务1中的名字全部修改,事务1 未提交
2.开启事务2,先查看
3.在事务2插入系数据,并提交。
4.在事务1 查看数据 发现出现新的数据。
电气工程的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞支持下,谢谢。