MySQL数据类型

![图片说明](https://uploadfiles.nowcoder.com/images/20200527/936154763_1590568339561_5A18F3CEE8AA538BA155A6D794C44D11 "图片标题")
![图片说明](https://uploadfiles.nowcoder.com/images/20200527/936154763_1590568399762_5AE29F6DEA2BDF014412FD079FC2752B "图片标题")
![图片说明](https://uploadfiles.nowcoder.com/images/20200527/936154763_1590568431051_F372107FD3B955D4173070469922DCF8 "图片标题")

0.约束

not null:不为空约束
foreign key:外键,从表添加,服从于主表
primary key:主键:唯一,只能有一个为空
unique 特别:可以有多个空,但是不为空的只能出现一次。
check:检查 MySQL中无法实现,可以通过enum或者触发器实现。

CREATE TABLE student(
    id INT PRIMARY KEY,  # 列级约束
    NAME VARCHAR(10) NOT NULL,   
    seat_id INT UNIQUE,
    major_id INT,
    gender CHAR(1),
    CONSTRAINT student_fk FOREIGN KEY(major_id) REFERENCES major(id) #表级约束
);

0.1创建完表后继续添加约束:

# 添加列级约束(只表示新加 不改变原来)
alter table 表名 modify column 字段名 约束
#添加表级约束
alter table 表名 add[constrains 约束名] 约束类型(字段名) [外键引用]
# case
alter table student add constraint fk_stu_class foreign key(class_id) references class(id)

1.事务

一个或一组sql语句组成一个执行单元,这个执行单元要么全执行,要么全不执行,每条sql语句相互依赖,某一条出现错误,整个单元回滚。

1.1mysql存储引擎

概念:数据库中不同的存储技术。

通过命令:show engines查看数据库支持存储引擎。

在MySQL中用的最多的存储引擎有:
innodb,myisam,memory.其中innodb支持事务。

1.2事务的创建(DDL语言没有事务之说)

隐式事务 :事务没有明显开启和结束标记

比如insert、update、delete语句。

显示事务创建

事物具有明显结束开启标志
前提:必须设置自动提交功能为禁用。
set autocommit=0;

步骤一:开启事务
set autocommit=0;
start transaction 可选的
步骤二:编写事务中的sql语句(select insert update delete)

步骤三:结束事务
commit;提交事务

SET autocommit=0;
UPDATE account    
SET balance=1000
WHERE username='张无忌';
UPDATE account
SET balance=1000
WHERE username='赵敏';
commit;

rollback:回滚事务

SET autocommit=0;
UPDATE account    
SET balance=1000
WHERE username='张无忌';
UPDATE account
SET balance=1000
WHERE username='赵敏';
ROLLBACK;   #执行完后不发生变化

savapoint

#savapoint 用法
SET autocommit=0;
START TRANSACTION;
DELETE FROM account
WHERE username='张无忌';
SAVEPOINT a;   # 设置保存点a
DELETE FROM account
WHERE username='赵敏';
ROLLBACK TO a;
SELECT * FROM account;  

![图片说明](https://uploadfiles.nowcoder.com/images/20200527/936154763_1590554593859_6DA22508F57ABFBCAF448131A31E55EE "图片标题")
![图片说明](https://uploadfiles.nowcoder.com/images/20200527/936154763_1590554551773_10CECE990F4B043D85FA31D7C60C0A64 "图片标题")

1.3 运行多个事务(重点)

脏读:

对于两个事务T1,T2,事务T1读取到了T2更新但还未提交的数据,后T2回滚,T1读取的内容就是临时且无效的。

不可重复读

对于两个事务T1,T2,T1读取一个字段后,T2更新该字段,之后,T1再次读取同一个字段,值不相同了。

幻读

对于两个事务,T1读取了表中的某个字段,之后T2插入了新的行,T1读取相同字段就会多出几行。

1.3.1 数据库提供四种事务隔离级别:

![图片说明](https://uploadfiles.nowcoder.com/images/20200527/936154763_1590552440632_6A9AED1565FC0725FBDFFEE2995A8C14 "图片标题")
read_uncommitted:允许事务读取未被其他事务提交的变更、脏读、不可重复读、幻读问题都会出现。
read committed:只允许事务读取已被其他事务提交了的变更,可以避免脏读,不可避免幻读和不可重复读。
repeatable read:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读任然存在。
serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,修改,删除操作,所有并发问题都可避免,但性能底下。

1.3.2隔离级别的命令

1.查看当前隔离级别:
select @@transaction_isolation
2.设置当前mysql连接的隔离级别:
set transaction isolation level read committed;
3.设置数据库系统全局的隔离级别:
set global transaction islation level read commited;

2.视图

含义:

虚拟表,和普通表一样使用,mysql5.1版本新特性,是通过表动态生成的数据。只保存查询逻辑,不保存查询结果。

应用场景:

  • 多个地方用到同样的查询结果
  • 该查询结果使用sql语句较复杂 ?

语法

create view 视图名
as 
查询语句

# case:
CREATE VIEW e_join_d
AS
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN `departments` d ON  e.`department_id`=d.`department_id`
INNER JOIN jobs j ON j.job_id=e.job_id;
  • 重用sql语句
  • 简化复杂的sql操作,不必知道它的细节。
  • 保护数据,提高安全性。

视图的修改

##方式一:
create or replace view 视图名
as
查询语句

##方式二
alter view 视图名
as
查询语句

视图的删除

drop view 视图名;

视图的查看

desc 视图名
show create view 视图名;