2021-07-23MySQL03笔记

MySQL-03

1、约束

1.3、外键约束

  • 关于外键约束的相关术语:

    ​ 外键约束: foreign key

    ​ 外键值:外键字段中的每一个值。

  • 业务背景:

    ​ 请设计数据库表,用来维护学生和班级的信息?

    ​ 第一种方案:一张表存储所有数据

no(pk) name classno classname

---------------------------------------------------------------------------------------------------------------------*

1 zs1 101 北京大兴区经济技术开发区亦庄二中高三1班
2 zs2 101 北京大兴区经济技术开发区亦庄二中高三1班
3 zs3 102 北京大兴区经济技术开发区亦庄二中高三2班
4 zs4 102 北京大兴区经济技术开发区亦庄二中高三2班
5 zs5 102 北京大兴区经济技术开发区亦庄二中高三2班

缺点:冗余。【不推荐】

第二种方案:两张表(班级表和学生表)

t_class 班级表
cno(pk) cname
------------------------------------------------------------------------------*
101 北京大兴区经济技术开发区亦庄二中高三1班
102 北京大兴区经济技术开发区亦庄二中高三2班

t_student 学生表
sno(pk) sname classno(该字段添加外键约束fk)
----------------------------------------------------------------------------------*
1 zs1 101
2 zs2 101
3 zs3 102
4 zs4 102
5 zs5 102

  • 将以上表的建表语句写出来:

t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。

顺序要求:

​ 删除数据的时候,先删除子表,再删除父表。
​ 添加数据的时候,先添加父表,在添加子表。
​ 创建表的时候,先创建父表,再创建子表。
​ 删除表的时候,先删除子表,在删除父表。

drop table if exists t_student;
drop table if exists t_class;

create table t_class( cno int, cname varchar(255), primary key(cno));

create table t_student(sno int, sname varchar(255), classno int , primary key(sno), foreign key(classno) references t_class(cno) );

insert into t_class values(101,‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’);

insert into t_class values(102,‘yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy’);

insert into t_student values(1,‘zs’,101);

insert into t_student values(2,‘zs’,102);

insert into t_student values(3,‘zs’,101);

insert into t_student values(4,‘zs’,102);

insert into t_student values(5,‘zs’,101);

insert into t_student values(6,‘zs’,102);

select * from t_class;

mysql> select * from t_class;
±----±----------------------------------------------+
| cno | cname |
±----±----------------------------------------------+
| 101 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 102 | yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy |
±----±----------------------------------------------+

select * from t_student;

mysql> select * from t_student;
±----±------±--------+
| sno | sname | classno |
±----±------±--------+
| 1 | zs | 101 |
| 2 | zs | 102 |
| 3 | zs | 101 |
| 4 | zs | 102 |
| 5 | zs | 101 |
| 6 | zs | 102 |
±----±------±--------+

insert into t_student values(7,‘zs’,103);

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (bjpowernode.t_student, CONSTRAINT t_student_ibfk_1 FOREIGN KEY (classno) REFERENCES t_class (cno))//错误1452(23000):无法添加或更新子行:外键约束失败(bjpowernode.t\u student,约束t\u student\u ibfk\u 1外键(classno)引用t\u classcno

  • 外键值可以为NULL?

    ​ 外键可以为NULL。

  • 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?

    ​ 注意:被引用的字段不一定是主键,但至少具有unique约束。

2、存储引擎?(整个内容属于了解内容)

2.1、完整的建表语句

			CREATE TABLE `t_x` (
	  `id` int(11) DEFAULT NULL
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;

​ 注意:在MySQL当中,凡是标识符是可以使用飘号括起来的。最好别用,不通用。

​ 建表的时候可以指定存储引擎,也可以指定字符集。

​ mysql默认使用的存储引擎是InnoDB方式。

​ 默认采用的字符集是UTF8

2.2、什么是存储引擎呢?

  • 存储引擎这个名字只有在mysql中存在。(Oracle中有对应的机制,但是不叫做存储引擎。Oracle中没有特殊的名字,就是“表的存储方式”)

  • mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。

  • 每一个存储引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎。

2.3、查看当前mysql支持的存储引擎?

show engines \G

mysql 5.5.36版本支持的存储引擎有9个:

mysql> show engines \G
*************************** 1. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 9. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
9 rows in set (0.01 sec)

2.4、常见的存储引擎?

Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO

MyISAM这种存储引擎不支持事务。

MyISAM是mysql最常用的存储引擎,但是这种引擎不是默认的。

MyISAM采用三个文件组织一张表:

​ xxx.frm(存储格式的文件)
​ xxx.MYD(存储表中数据的文件)
​ xxx.MYI(存储表中索引的文件)

优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。

缺点:不支持事务。


Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES

优点:支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障。

表的结构存储在xxx.frm文件中

数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
这种InnoDB存储引擎在MySQL数据库崩溃之后提供自动恢复机制。
InnoDB支持级联删除和级联更新。


Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO

缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。

优点:查询速度最快。

以前叫做HEPA引擎。

上一篇:CMPS 102


下一篇:DB2批量插入性能对比