Py学习  »  DATABASE

mysql数据库入门教程(10):标识列和事务

总裁余 • 3 年前 • 345 次点击  

一.标识列

标识列有点类似前文的约束。

又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值
使用方法在插入的列后面 添加关键字 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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果 ID2 和ID3 是自动增长的
自动增长的插入时可以写null,可以不写

#2、修改自动增长步长

#查看


SHOW VARIABLES LIKE '%auto_increment%';
  • 1
  • 2

默认为1
第一个为步长,第二个为起始值,起始值不支持值

修改步长

SET auto_increment_increment=3;
  • 1

重新插入数据

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

#3、修改表时设置标识列

ALTER TABLE 表名 MODIFY COLUMN 列名 INT 键 AUTO_INCREMENT;#

ALTER TABLE tab_identity MODIFY COLUMN id INT UNIQUE AUTO_INCREMENT;#设置唯一键
  • 1

#四、修改表时删除标识列
直接去掉标识列语法

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';
  • 1

可以发现自动提交是开启的

显式事务

隐式事务有时候不好,比如我们需要的是两条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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

回滚演示下


#创建表
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

在新的例子中设置金额为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. 事务1开启,查看原始数据,将ID=1 的名字改为杨幂,未提交。

  2. 在事务2 查看,发现id=1并未改变.没有出现脏读

4.事务1提交

5.再次查看事务2

id=1并未改变成杨幂,实现重复读功能。

6.提交事务2 ,再次查看
ID=1 变啦

第三个可以解决脏读和不可重读,幻读不能解决。

算例4:幻读演示;

1.开启事务1,事务1中的名字全部修改,事务1 未提交

2.开启事务2,先查看

3.在事务2插入系数据,并提交。
4.在事务1 查看数据 发现出现新的数据。

在这里插入图片描述

电气工程的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞支持下,谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/73001
 
345 次点击