约束

在创建表的同时可以给表的字段添加相应的约束,添加约束的目的是为了保证表中的数据的合法性、有效性、完整性。



常见的约束有哪些呢?
非空约束(not null):约束的字段不能为null。
唯一约束(unique):约束的字段不能重复。但可以为null。
主键约束(primary key):约束的字段不能为null,也不能重复。
外键约束(foreign key):数据要是包含在参照表中的数据。
检查约束(check):这个是Oracle数据库有的,mysql目前不支持这个。

create table t_user(
	id int primary key,//列级约束
	pnumber int unique,//列级约束
	username varchar(255) not null,
	usercode varchar(255) not null,
	unique(username,usercode),//表级约束
	password varchar(255) not null
);

not null没有表级约束。
unique(XXX,xxx)代表着XXX与xxx联合起来不能重复。

第一范式:要求任何一张表都应该有主键。
主键作用:唯一标识。

主键的分类
字段数量:单一主键、复合主键(不建议使用,违背三范式)。
主键性质:自然主键(与业务无关联的复合数)、业务主键(主键值和系统的业务挂钩,例如,身份证号码,银行卡号,业务的变化可能会有变动,也不建议使用)。
注意:一张表的主键约束只能有一个。

主键值自增

create table t_user(
	id int primary key auto_increment,//自动增加一个数字
	username varchar(255)
);

auto_increment自动增加数字。
外键约束
外键约束:foreign key
删除数据时,要先删除子表。
添加数据时,要先添加父表。
创建表时,创建父表。
删除表时,要先删除子表。

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

foreign key(字段) references 表名(字段)

外键只是可以为NULL的,外键引用的字段可以不是主键但至少有unique约束。



存储引擎
不同的存储引擎有着不同的存储方式。
一条完整的建表语句:

CREATE TABLE `t_student` (
  `no` bigint DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `brith` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

注意:在mysql标识可以使用飘号括起来。
存储引擎只有在mysql中存在。
mysql中常见的存储引擎:
查看当前mysql支持的存储引擎。
show engines\G 通过查看表结构的命令来查看表所使用的引擎。
改变表所用的引擎:
alter table 表名 engine = 引擎名称;

+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

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: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 5. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 8. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
9 rows in set (0.00 sec)

三种常用的存储引擎:
1.
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO

三个文件表示各表
xxx.frm
xxx.MYD
xxx.MYI
可以转化为压缩,只读表来节省空间
不支持事务。
2.
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
在数据库目录中用.flm格式文件表示。
支持事务。
安全。
mysql服务器崩溃可以自动恢复。
重量级引擎。
3.
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
在数据库目录中以.flm文件存在,不支持事务,数据容易丢失,数据存储在内存中,查询速度最快。