数据库课程笔记
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 视图名;