标识列
又称“自增长列"
特点:
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语句,最后回滚,原来的数据就不存在了。
网友评论