1.约束概述
约束的作用就是保证表中的数据有效
分类:
非空约束 not null(表中数据不能为NULL)
唯一性约束 unique (约束的字段不能重复,但是可以为NULL,也就是NULL可以重复)
主键约束 primary key (主键不能为NULL,同时不可以重复)
外键约束 foreign key
检查约束 check(Mysql不支持)
联合唯一性:🎈
设定两个字段联合起来具有唯一性的方法:(设置name和email联合唯一性限制)
mysql> create table vip( -> id int, -> name varchar(30), -> email varchar(30), -> unique(name,email) -> ); Query OK, 0 rows affected (0.13 sec)
注意:在Mysql中,如果一个字段同时被not null和unique约束,则该字段自动变为主键字段😊
联合主键约束:🙌(id和name联合起来做主键,复合主键)
mysql> create table vip( -> id int, -> name varchar(30), -> email varchar(100), -> primary key(id,name) -> ); Query OK, 0 rows affected (0.06 sec)
实际开发中不建议使用复合主键🎶主键值建议使用int,bigint,char类型,且主键值一般都是定长的
注意:对于一张表来说只要有主键和unique约束的,自动添加索引😶🌫️
2.外键的妙用
使用外键可以减少数据表的冗余且使之满足某一范式,但同时连接查询也会降低查询的效率🙌
使用实例:
其中cno字段是class表的classno字段的一个外键
mysql> create table stu( -> no int primary key auto_increment, -> name varchar(50), -> cno int, -> foreign key(cno) references class(classno) -> );
注意:外键中引用的其他表的字段不一定是要主键,但是一定要有unique约束🎈
3.存储引擎
存储引擎是Mysql中特有的术语🎈实际上是一个表存储/组织数据的方式
Mysql默认的存储引擎是InnoDB,默认的编码方式是utf-8
目前Mysql所有存储引擎:
mysql> show engines\G *************************** 1. row *************************** Engine: MEMORY Support: YES Comment: Hash based, stored in memory, useful for temporary tables Transactions: NO XA: NO Savepoints: NO *************************** 2. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables 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: InnoDB Support: DEFAULT Comment: Supports transactions, row-level locking, and foreign keys Transactions: YES XA: YES Savepoints: YES *************************** 6. row *************************** Engine: PERFORMANCE_SCHEMA Support: YES Comment: Performance Schema 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: MyISAM Support: YES Comment: MyISAM storage engine Transactions: NO XA: NO Savepoints: NO *************************** 9. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL 9 rows in set (0.00 sec)
MyISAM
MyISAM管理的表具有如下特征:
使用三个文件表示每个类:
格式文件:存储表结构的定义(mytable.frm)
数据文件:存储表行的内容(mytable.MYD)
索引文件:存储表上的索引(mytable.MYI)
优点:可转化为压缩,只读来节省空间🎍
InnoDB
mysql默认的存储引擎,支持事务,支持数据库崩溃后自动恢复机制
非常安全!
特点:
每个InnoDB表在数据库目录中以.frm格式文件表示
InnoDB表空间tablespace被用于存储表的内容
提供一组用来记录事务性活动的日志文件
提供全ACID兼容
在Mysql服务器崩溃后自动恢复
多版本(MVCC)和行级锁定
用COMMIT,SAVEPOINT,及ROLLBACK支持事务处理
支持外键及引用的完整性,包括级联删除和更新
缺点:效率不是很高,不能压缩不能转化为只读,不能很好的节省存储空间❌
MEMORY
特点:
在数据库目录内,每个表均以.frm格式文件进行存储
表数据及索引存储在内存中,一断点就消失(目的:查询快速!)
表级锁机制
不能包含TEXT或HEAP引擎
优缺点:效率最高但是数据不安全