社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

总裁余 • 4 年前 • 430 次点击  

一.标识列

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

又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值
使用方法在插入的列后面 添加关键字 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
 
430 次点击