# 约束
# 概念
constraint,在创建表的时候,创建一些约束,保证表中数据的完整性、有效性
# 作用
保证表中的数据有效。
# 非空约束
not null:字段值不能为NULL
create table student(
id int,
name varchar(50) not null // 只有列级 '非空约束',没有表级 '非空约束'
);
# 唯一性约束
unique:字段值不能重复,但可以为NULL(可以有多条NULL值)
create table student(
id int,
name varchar(50) unique
);
案例:
mysql> select * from student;
+------+------+
| id | name |
+------+------+
| 1 | z |
| 1 | NULL |
| 1 | NULL |
| 1 | NULL |
| 1 | NULL |
| 1 | NULL |
+------+------+
6 rows in set (0.00 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
# 建立多个字段唯一性约束
1. 多字段各自唯一性约束
create table student(
id int unique,
name varchar(50) unique // 列级约束
);
上边的表,id 和 name 字段各自有唯一性约束,互不影响。
2. 多字段组合后唯一性约束
create table student(
id int,
name varchar(50),
unique(id, name) // 表级约束
);
上边的表,id 和 name 字段联合起来唯一。
# 注意
在Mysql中,如果一个字段同时被 not null 和 unique 约束的话,该字段自动成为主键。(Oracle中不一样)
# 主键约束
primary key
主键值是每一行的唯一标识
主键特征:unique + not null
写法一:列级约束
create table student(
id int primary key,
name varchar(255)
);
写法二:表级约束
create table student(
id int,
name varchar(255),
primary key(id)
);
# 多个字段建立主键约束
// 复合主键
create table student(
id int,
name varchar(255),
primary key(id, name)
);
//错误 一张表不能建立多个主键
create table student(
id int primary key,
name varchar(255) primary key
);
# Mysql 中自然主键
create table student(
id int primary key auto_increment, // 从 1 开始递增
name varchar(255)
);
# 外键约束
foreign key
create table t_class(
t_id int primary key auto_increment,
t_name varchar(50)
);
create table student(
id int primary key auto_increment,
name varchar(255),
cno int,
foreign key (cno) references t_class(t_id)
);
注意:子表中的外键引用父表中的某个字段,被引用的这个字段不一定是主键,但是至少有 unique 约束。(否则,子表不能确定引用的是父表中的那条数据)
注意:外键可以为 NULL
# 检查性约束
check(Mysql 不支持, Oracle支持)