id="c_n9"width="1920"height="990"style="position: fixed; top: 0px; left: 0px; z-index: -1; opacity: 0.5;">

数据库笔记03

数据库笔记03

ps:本篇文章只是自己的笔记,不喜勿喷。若发现问题还望私聊我,谢谢

补充笔记02

  1. 快速创建表,其实也就是将查询表的结果作为表创建:

    create table 表名 as select .... from .....;
    
  2. 快速的向表中插入数据:

    insert into 表名(相关字段) values (字段对应的值),(对应的值),.......;
    
  3. 快速的删表:使用truncate关键字,语法格式:j

    truncate 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等等

外键约束

  1. 一张表中某一个字段的值受限于另一张表中的某一个字段的数据。这种需要用到就是外键约束

  2. 由于外键约束的,出现了主从关系,可以理解为父表,子表;那么在删除表,创建表,向表中插入数据,更新数据就都存在一定的顺序关系:

    事件 顺序
    创建表 父->子
    删除表 子->父
    插入数据 父->子
    更新数据 父->子
    删除表中的数据 子->父

    以上理解即可,update这里可能会违反参照完整性,需要用到拒绝,级联,null来解决

  3. 语法格式:

    create table sample(
    	字段1 数据类型,
        字段2 数据类型,
        .............
        foreign key(需要约束的字段) references 父表(字段)
    );
    

    约束的字段需要和父表的数据类型相同

  4. 外键中引用的父表字段不一定为主键,只要字段有unique约束就行,其外键可以为NULL

  5. 外键中相关术语同主键约束中的类似,将其替换为外键即可。

存储引擎

在MySQL中专有的术语,其他的没有;其实存储引擎是一个表组织/存储数据的方式,不同的存储引擎,组织/存储数据的方式不一样

在建表的时候可以指定对应的存储引擎:在')'的右侧进行指定engine=....default charest=......;

查看MySQL中的存储引擎:show engines \G

对应一张表,加有主键的or unique的,会自动的创建索引文件

事务

  1. 一个事务就是一个完整的业务逻辑,是最小的单元,不可再分

  2. 一个完整的业务逻辑:

    ​ 以转账为例,a向b转账,a的money减少,b的增多(update语句)。这就是一个完整的业务逻辑。以上操作是一个最小的单元不可再分,两个update语句必须同时成功or失败,那么钱的数目才是正确的

  3. 只有DML语句才涉及到事务--insert,update,delete;只要涉及到对数据库中的数据的增删改那么就要考虑事务,涉及到事务就和安全相关。

  4. 事务的实质就是多个DML语句同时执行,同时成功/失败

  5. 事务通过事务性活动记录日志文件来实现同时成功/失败,在事务执行过程中可以提交事务,回滚事务;提交事务:先清除所有的事务活动日志记录,将数据储存到数据库中,其完成标志着事务是全部成功的一种结束;回滚事务:其他同上,但是其的完成,标志着这是一种全部失败的结束

  6. 事务(transaction)提交事务:commit语句 回滚事务:rollback语句

  7. 在MySQL中的默认事务行为是:没执行一条DML语句就会自动提交一次

  8. 关闭事务的自动提交:start transaction;

  9. 事务的四个特性: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文件的路径)****

posted @ 2022-02-03 17:20  hellozmc  阅读(102)  评论(0编辑  收藏  举报