# 约束

# 概念

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支持)