数据库笔记03
数据库笔记03
ps:本篇文章只是自己的笔记,不喜勿喷。若发现问题还望私聊我,谢谢
补充笔记02
-
快速创建表,其实也就是将查询表的结果作为表创建:
create table 表名 as select .... from .....;
-
快速的向表中插入数据:
insert into 表名(相关字段) values (字段对应的值),(对应的值),.......;
-
快速的删表:使用
truncate
关键字,语法格式:jtruncate table 表名;
使用truncate删除表中数据是直接截断,删除的效率很高,且不可以rollback
使用delete删除数据是一条一条的删除的,效率很低,删除后也不会释放其对应的内存空间,并且可以rollback
约束(constraint)
其指的是在创建表的时候,对一些字段加上一些约束(限制条件),来保证表中数据的完整性以及有效性
分为:
种类 | 关键字 |
---|---|
非空约束 | not null |
唯一约束 | unique |
主键约束 | primary key |
外键约束 | foreign key |
检查约束 | check(MySQL中不支持,Oracle中支持) |
非空约束
只能存在列级约束,其被约束的字段不能为NULL,在创建表的时候进行使用,有点类似之前为一个字段添加默认值的写法:字段 数据类型 not null
唯一约束
这个可以存在列级和表级约束,其约束的字段不能够出现重复的数据,但是可以出现NULL。写法同上,替换为unique即可。
以上时列级约束的写法,表级约束就是多个字段联合起来进行约束,写法为:
create table sample
(
字段名 数据类型,
.............
unique(字段1,字段2,.....)
);
通过这种表级约束,查看的时候就需要将一个字段联合起来进行看了。
可以将not null和unique联合起来进行书写,但是在MySQL中就会默认为primary key;但是在Oracle数据库中不是这样的
列级约束 | 表级约束 |
---|---|
约束放在列的后面 | 不是列级,反之。(可以实现多个字段进行联合约束) |
主键约束
ps:在一张表中只能存在一个主键约束
相关术语:
术语 | 释 |
---|---|
主键约束 | 一种约束 |
主键字段 | 存在主键约束的字段 |
主键值 | 存在主键约束字段所对应的值,数据 |
主键:
主键值是每一行记录的唯一标识;也是每一行记录的身份标识,基本上每一张表都需要存在主键(这个东西可以类比身份证号码)
其特征:not null + unique (非空&不能重复)
添加方式:同上;列级约束的叫:单一主键,表级约束的叫:复合主键 (一般推荐使用单一主键)
主键还可以分为业务主键(业务相关,类似银行卡号等等)和自然主键(自然数,0,1,2,3........)
在MySQL中,有一种机制,可以帮助自动的维护一个主键值:使用auto_increment
,这个通常放在primary key之后,这个可以实现自增,从1开始。
一般推荐主键对应的字段数据类型为:int,bigint等等
外键约束
-
一张表中某一个字段的值受限于另一张表中的某一个字段的数据。这种需要用到就是外键约束
-
由于外键约束的,出现了主从关系,可以理解为父表,子表;那么在删除表,创建表,向表中插入数据,更新数据就都存在一定的顺序关系:
事件 顺序 创建表 父->子 删除表 子->父 插入数据 父->子 更新数据父->子删除表中的数据 子->父 以上理解即可,update这里可能会违反参照完整性,需要用到拒绝,级联,null来解决
-
语法格式:
create table sample( 字段1 数据类型, 字段2 数据类型, ............. foreign key(需要约束的字段) references 父表(字段) );
约束的字段需要和父表的数据类型相同
-
外键中引用的父表字段不一定为主键,只要字段有unique约束就行,其外键可以为NULL
-
外键中相关术语同主键约束中的类似,将其替换为外键即可。
存储引擎
在MySQL中专有的术语,其他的没有;其实存储引擎是一个表组织/存储数据的方式,不同的存储引擎,组织/存储数据的方式不一样
在建表的时候可以指定对应的存储引擎:在')'的右侧进行指定engine=....default charest=......;
查看MySQL中的存储引擎:show engines \G
对应一张表,加有主键的or unique的,会自动的创建索引文件
事务
-
一个事务就是一个完整的业务逻辑,是最小的单元,不可再分
-
一个完整的业务逻辑:
以转账为例,a向b转账,a的money减少,b的增多(update语句)。这就是一个完整的业务逻辑。以上操作是一个最小的单元不可再分,两个update语句必须同时成功or失败,那么钱的数目才是正确的
-
只有DML语句才涉及到事务--insert,update,delete;只要涉及到对数据库中的数据的增删改那么就要考虑事务,涉及到事务就和安全相关。
-
事务的实质就是多个DML语句同时执行,同时成功/失败
-
事务通过事务性活动记录日志文件来实现同时成功/失败,在事务执行过程中可以提交事务,回滚事务;提交事务:先清除所有的事务活动日志记录,将数据储存到数据库中,其完成标志着事务是全部成功的一种结束;回滚事务:其他同上,但是其的完成,标志着这是一种全部失败的结束
-
事务(transaction)提交事务:commit语句 回滚事务:rollback语句
-
在MySQL中的默认事务行为是:没执行一条DML语句就会自动提交一次
-
关闭事务的自动提交:
start transaction;
-
事务的四个特性:ACID;A:原子性,不可再分,最小的单元;C:一致性,同时成功/失败;I:隔离性,事务之间相互隔离;D:连续性,事务完成的一个保障,事务提交时,相当于将数据存到存储设备中
事务的隔离性的四个级别
读未提交(read uncommitted)level low
即事务a可以读取事务b中未提交的数据;这种可能会出现“脏读现象(dirty read)”,就是说读到了脏数据;但是这种这是理论中存在的,一般的数据库不会采用这种方式。一般是二档往上
读已提交 (read committed)
即事务a可以读取到事务b中提交的数据;其解决了脏读的现象,但是不能够重复读数据(即每次读到的数据不一样),这种隔离方式所读到的数据是最真实的,Oracle数据库事务默认的隔离方式
可重复读 (repeatable read)
即事务b即提交了数据,事务b中也读不到数据;其解决了不可重复读的现象,每次所读到数据都是一致的,即刚开始的数据,可能会出现“幻影读”的现象,即所读都是幻象,所读的数据不够真实;这是MySQL中默认的事务隔离方式
序列化 (serializable)level high
其解决了所有的问题,事务与事务之间不能够并发,只能排队,按照先后顺序来进行执行,每次所读到的数据都是最真实的,但是效率很低。
事务其他知识点
查看数据库事务的隔离级别:select @@transaction_isolation;
修改数据库的隔离性级别:set global/session transaction isotion level read committed/read uncommitted/repeatable read/serializable;
globle是全局,针对所用的会话;session会话,只针对于当前的这个会话
杂谈
xxx.sql文件是sql脚本文件,包含大量的SQL语句,当执行sql文件时,就会执行大量的SQL语句;如若批量的执行SQL语句,可以使用SQL的脚本文件,导入的方法:source (sql文件的路径)
****