对于关系型数据库 MySQL 前面一节已经讲过表相关操作,如感兴趣戳此直达[关系型数据库 MySQL 表相关操作],对于已经创建好的表,虽然字段的数据类型决定了所能存储的数据类型,但是表中所存储的数据是否合法并没有进行检查,想要对这些数据进行检查时,就可以通过约束来完成。
所谓完整性是指数据的准确性和一致性,而完整性检查是指检查数据的准确性和一致性。
MySQL中,常用的几种约束
约束类型 | 非空 | 默认值 | 唯一 | 主键 | 自增 | 外键 |
---|---|---|---|---|---|---|
关键字 | not null | Default | unique | primary key | auto_increment | foreign key |
1、 非空约束(NOT NULL,NK)
当数据库表的某个字段不希望设置为空时(NULL),则在该字段上加上 “NOT NULL” 约束条件,保证所有记录中该字段都有值。若该字段为空,则数据库会报错。非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
基本语法如下:
代码语言:javascript复制Create table table_name(
属性名 数据类型 NOT NULL,
);
代码语言:javascript复制eg:create database test;
use test;
create table t_dept(
deptno int(20) not null,
dname varchar(20),
loc varchar(40)
);
--> 取消非空约束
代码语言:javascript复制alter table t_dept modify deptno varchar(20) null;
2、 默认值(default)
当数据库表中插入一条新纪录时,如果没有为某个字段赋值,那么数据库系统就会自动为这个字段插入默认值。
代码语言:javascript复制Create table table_name(
属性名 数据类型 default 默认值,
……);
代码语言:javascript复制eg:CREATE TABLE t_dept1(
deptno int NOT NULL,
dname varchar(20) default “JiekeXu”,
loc varchar(40)
);
注:字符串要使用双引号,MySQL 5.5 中是可以使用单引号的。
3、唯一约束(unique, UK)
当数据库表中的某个字段上的内容不允许重复时,则可以使用 UK 约束进行设置。即可保证数据库表中的值不重复。唯一约束是指定 table 的列或列组合不能重复,保证数据的唯一性。唯一约束不允许出现重复的值,但是可以为多个 null。
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
基本语法如下:
代码语言:javascript复制Create table table_name(
属性名 数据类型 UNIQUE L,
……);
-- 创建表时设置,表示用户名、密码不能重复
代码语言:javascript复制createtable temp(
idint not null ,
name varchar(20),
password varchar(10),
unique(name,password)
);
-- 添加唯一约束
代码语言:javascript复制alter table temp add unique (name,password);
-- 修改唯一约束
代码语言:javascript复制alter table temp modify name varchar(25) unique;
-- 删除约束
代码语言:javascript复制alter table temp drop index name;
4、主键约束(primary key,PK)
主键约束(PK)primary key 在创建数据库表时为某些字段加上 “PRIMARY KEY" 约束条件,则该字段可以唯一标识所有记录。PK 约束必须满足主键字段的值唯一、非空。
主键约束相当于 唯一约束 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。
当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
代码语言:javascript复制-- 单字段主键
create table temp(
id int primary key,
name varchar(20)
);
-- 多字段主键
create table temp(
id int ,
name varchar(20),
pwd varchar(20),
primary key(id, name)
);
-- 删除主键约束
代码语言:javascript复制alter table temp drop primary key;
-- 添加主键约束
代码语言:javascript复制alter table temp add primary key(id,name);
-- 修改主键约束
代码语言:javascript复制alter table temp modify id int primary key;
5、 字段值自动增加(AUTO_INCREMENT)
Auto_increment 是 MySQL 唯一扩展的完整性约束,当为数据库表中插入新纪录时,字段上的值会自动生成唯一的 ID。在具体设置 AUTO_INCREMENT 约束时,一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。由于设置了AUTO_INCREMENT 约束后的字段会生成唯一的 ID,所以该字段也经常会设置成 PK 主键。
基本语法如下:
代码语言:javascript复制Create table table_name(
属性名 数据类型 auto_increment,
……);
在上述语句中,属性名参数表示所要设置自动增加的约束的字段名字,在默认情况下,该字段的值是从 1 开始增加的,每增加一条记录,记录中该字段的值就会在前一条记录的基础上加 1。
代码语言:javascript复制eg:create table t_dept_tmp(
deptno int primary key auto_increment,
dname varchar(20),
loc varchar(40)
);
6、 外键约束(FOREIGN KEY,FK)
设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定。
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
基本语法格式如下:
代码语言:javascript复制Create table table_name(
属性名1 数据类型,
属性名2 数据类型,
CONSTRAINT 外键约束名 FOREIGN KEY(属性名1)
REFERENCES表名(属性名2)
);
-- 基本模式
代码语言:javascript复制-- 主表
create table temp(
id int primary key,
name varchar(20)
);
代码语言:javascript复制-- 副表
create table temp2(
id int,
name varchar(20),
classes_id int,
foreign key(id) references temp(id)
);
-- 多列外键组合,必须用表级别约束语法
代码语言:javascript复制-- 主表
create table classes(
id int,
name varchar(20),
number int,
primary key(name,number)
);
-- 副表
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/*表级别联合外键*/
foreign key (classes_name, classes_number)
referencesclasses(name, number)
);
-- 删除外键约束
代码语言:javascript复制alter table student drop foreign keystudent_id;
-- 增加外键约束
代码语言:javascript复制alter table student add foreign key(classes_name,classes_number) references classes(name, number);