获取中...

-

Just a minute...

约束的定义

约束用于规定表中的数据规则,保证表中的记录的完整和有效。如果存在违反约束的数据行为,行为会被约束终止,约束可以在创建表时规定(通过 create table 语句),或者在表创建之后规定(通过 alter table 语句)

约束种类

  • 非空约束(not null)
  • 唯一性约束(unique)
  • 主键约束(primary key)
  • 外键约束(foreign key)
  • 检查约束(check 适用于 Oracle)
  • 缺省约束(default)

注意:约束有上面的6种,但是这些约束还有:表级约束列级约束的划分

列级约束:包含在列定义中,直接跟在该列的定义之后,用 空格 分割;不必指定列名。是对某一个特定列的约束,有五种:主键、唯一、检查、默认、非空,即除了外键约束外,所有约束都有列级约束的表现形式

表级约束:与列级约束的定义相互独立,不包含在列级约束中;通常用于对多个列一起进行约束,约束与定义之间用 , 分割;必须指出要约束的列的名称。用于对多个列一起进行约束,有四种:主键、外键、唯一、检查(巧记:非空约束和缺省约束没有表级约束的表现形式)

而每一种约束又有单一约束联合约束之分,比如我们常见的非空约束,既可以只约束一个字段,也可以同时约束多个字段

非空约束

创建表,给字段添加非空约束

1
2
3
4
5
6
// 非空约束的列级约束表现形式
create table t_user(
id int(3),
name varchar(255) not null
);
// 注意:非空约束没有表级约束,只有列级约束,所以这里只给出了列级约束的例子

插入数据时如果没有插入 name 字段的数据,则会报错

唯一性约束

使用 unique 约束的字段,具有唯一性,不可以重复,但是可以为 null

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 唯一性约束的列级约束表现形式
create table t_user(
id int(3),
name varchar(255) not null,
email varchar(255) unique
);

// 唯一性约束的表级约束表现形式
create table t_user(
id int(3),
name varchar(255) not null,
email varchar(255),
unique(email)
);

如果有两条检录插入相同的 email 值,则会报错

1
2
3
4
5
mysql> insert into t_user(id,name,email) values(1,'xlj','932834897@qq.com');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_user(id,name,email) values(2,'jay','932834897@qq.com');
ERROR 1062 (23000): Duplicate entry '932834897@qq.com' for key 'email'

拓展:在实际开发中有时候可能会有注册用户时用户名不能重复的需求,这时候我们就可以通过唯一性约束来实现,而不必非要通过后端的逻辑去实现

上面的例子都是单一约束,我们再来看一下唯一性约束的联合约束的表现形式,联合约束多见于表级约束:

联合约束意为如果两条记录中,所定义的联合约束的字段的值都相同,则报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 唯一性约束的联合约束形式
create table t_user(
id int(3),
name varchar(255) not null,
email varchar(255),
unique(name, email)
);

// 插入第一条数据
mysql> insert into t_user(id,name,email) values(1,'xxx','qq.com');
Query OK, 1 row affected (0.05 sec)

// 插入第二条数据,如果只是与联合约束中的某一个字段相同,并不会报错
mysql> insert into t_user(id,name,email) values(2,'mmm','qq.com');
Query OK, 1 row affected (0.05 sec)

// 如果是插入的记录中的两个联合约束的字段都与已存在的记录相同,则报错
mysql> insert into t_user(id,name,email) values(3,'mmm','qq.com');
ERROR 1062 (23000): Duplicate entry 'mmm-qq.com' for key 'name'

表级约束可以使用关键字 constraint 起名字,方便之后删除该约束

1
2
3
4
5
6
7
create table t_user(
id int(3),
name varchar(255) not null,
email varchar(255),
constraint t_user_name_email_unique unique(name, email)
);
// 格式: constraint 该约束起的名 约束()

主键约束

主键约束和 not null unique 的区别:给某个字段添加主键约束之后,该字段不能重复也不能为空,其表现效果上和 not null unique 相同,但二者的本质不同。因为主键约束还会默认添加为 索引 –index

主键呢又有 单一主键和复合主键之分,但是无论是单一主键还是复合主键,一张表的主键约束却只能有一个(只能有一个主键约束),但是可以作用于多个字段

单一主键:主键约束只作用于一个字段

复合主键:主键约束作用于多个字段(只能用于表级约束)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 单一主键(列级定义)
mysql> create table t_user(
-> id int(10) primary key,
-> name varchar(32)
-> );
Query OK, 0 rows affected (0.07 sec)


// 单一主键(表级定义)
mysql> create table t_user(
-> id int(10),
-> name varchar(32) not null,
-> constraint t_user_id_pk primary key(id)
-> );
Query OK, 0 rows affected (0.01 sec)

// 复合主键(标记定义)
mysql> create table t_user(
-> id int(10),
-> name varchar(32) not null,
-> email varchar(128) unique,
-> primary key(id,name)
-> );
Query OK, 0 rows affected (0.05 sec)

在 MySql 中提供了一个自动生成主键值的功能,主键值不用用户自己维护,默认从1开始自动递增

外键约束

不常用,而且不建议使用

致谢

本文参考自https://blog.csdn.net/w_linux/article/details/79655073,有兴趣的可以查看

相关文章
评论
分享
  • ubuntu 安装 redis

    redis是什么Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速。用Redis可以很轻松解决高并发的数据访问问题 环境Ubuntu18.04 准备工作sudo apt upda...

    ubuntu 安装 redis
  • css基本样式设置

    div中文字居中如何让一个div中的文字水平和垂直居中?设置如下:给定该div的长宽(或者二者只给出其一也可) 123456.box{ height: 100px; width: 30%; text-align: cente...

    css基本样式设置
  • nginx在centos7下的安装

    nginx是什么Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 的服务Nginx 特点是占有内存少,并发能力强一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构...

    nginx在centos7下的安装
  • spring boot程序的部署及运行

    将 spring boot 应用程序打包成 jar 包 我们使用 spring boot 的 maven 插件来构建管理整个应用程序,使用 mvn package 将应用程序打包成一个 jar 包 将 该 jar 包上传到 服务器 上...

    spring boot程序的部署及运行
  • Java 中 IO 操作总结

    java IO 操作分析直接看代码吧 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535...

    Java 中 IO 操作总结