MySQL中的约束

  • 主键约束
  • 自增约束
  • 唯一约束
  • 非空约束
  • 默认约束
  • 外键约束

主键约束

​ 它能够使我们唯一确定一张表中的一条记录,也就是我们给某个字段添加主键约束,就可以使得该字段不重复且不为空。

添加方法:

创建表时给某个字段添加主键约束

create table user(

​ id int primary key,

​ name varchar(20)

);

此时id字段不能重复,且不能为空。

联合主键

由多个字段共同组成的主键,这几个字段不可以全部相同。

1
2
3
4
5
6
create table user2(
id int,
name varchar(20),
passwd varchar(20),
primary key (id, name)
);

这里id和name不可以同时相同。

自增约束

作用:自增约束的字段值会自动增加,不需要在insert时显示赋予值。

1
2
3
4
create table user3(
id int primary key auto_increment,
name varchar(20)
);

insert into user3 (name) values (‘张三’); # 只添加name字段

但是也可以手动加上id字段,只是不可以与已有的重复。自动增加以最后一条数据的id为基准。

m-2-1.png

1
2
3
4
5
6
7
8
如果在创建表时忘了添加主键约束怎么办?
给表user4的id字段添加主键约束,如果表中id字段已有重复值,则添加失败:
alter table user4 add primary key (id); -- 修改表结构添加主键
或者是:
alter table user4 modify id int primary key; # 使用modify修改字段添加约束

如何删除已有主键呢?
alter table user4 drop primary key;

唯一约束

作用:限制某个字段的值不能重复,但是可以为空。(主键约束与它的区别限制不能为空且不能重复)

建表时创建唯一主键:

1
2
3
4
5
6
create table user_uni(
id int,
name varchar(20),
unique(id)
);
-- name字段有唯一约束,值不能重复

同时也可以这样写:

1
2
3
4
create table user_uni(
id int unique,
name varchar(20)
);

如果是下面这种写法,就是联合唯一约束,相加不能重复,

1
2
3
4
5
create table user_uni(
id int,
name varchar(20),
unique(id,name)
);

如果创建表时忘了添加唯一约束,可以单独添加,

1
2
ALTER TABLE user ADD UNIQUE(name);
ALTER TABLE user MODIFY name VARCHAR(20) UNIQUE;

如果想删除唯一约束:

1
alter table user drop index name;

非空约束

约束某个字段不能为空。

建表时添加非空约束:

1
2
3
4
CREATE TABLE user (
id INT,
name VARCHAR(20) NOT NULL
);

移除非空约束:

1
alter table user modify name varchar(20);

默认约束

约束某个字段的默认值。

建表时添加默认约束:

1
2
3
4
5
create table user2 (
id int;
name varchar(20);
age int default 13
);

插入数据时如果没有传入age的值,会默认置为13。

移除约束:

1
ALTER TABLE user MODIFY age INT;

外键约束

限制学生表中class_id的值必须来自class表中id字段的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 班级
CREATE TABLE classes (
id INT PRIMARY KEY,
name VARCHAR(20)
);

-- 学生表
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(20),
-- 这里的 class_id 要和 classes 中的 id 字段相关联
class_id INT,
-- 表示 class_id 的值必须来自于 classes 中的 id 字段值
FOREIGN KEY(class_id) REFERENCES classes(id)
);

-- 1. 主表(父表)classes 中没有的数据值,在副表(子表)students 中,是不可以使用的;
-- 2. 主表中的记录被副表引用时,主表不可以被删除。