数据完整性约束是在表和字段上强制执行的数据检验规则,为了防止不规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,主要是对空值和重复值的约束,使不符合规范的数据不能进入数据库,以保证数据存储的完整性和准确性。
按照约束的不同类型可以分为实体完整性、域完整性、参照完整性、用户自定义完整性。
用来标识表中的每一条记录,一条记录代表一个实体(entity)。
列级添加主键约束:
creat table <表名> (
<字段名1> <字段类型1> primary key,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>);
示例:
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
表级添加主键约束:
create table <表名>(
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
......
<字段名n> <字段类型n>,
[constraint 主键约束名] primary key(字段名1[,字段名2,...字段名n]));
示例:
mysql> create table employee(
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> primary key(e_name,e_sex));
已有表添加主键约束:
alter table <表名> add [constraint 主键约束名] primary key(字段名);
示例:
-- 创建无主键约束的表
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
-- 添加主键约束
mysql> alter table employee add primary key(e_id);
删除主键约束:
alter table <表名> drop primary key;
示例:
alter table employee drop primary key;
列级添加唯一约束:
creat table <表名> (
<字段名1> <字段类型1> unique,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>);
示例:
mysql> create table employee(
-> e_id int,
-> e_name varchar(5) unique,
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
表级添加唯一约束:
creat table <表名> (
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>,
[constraint 唯一约束名] unique (字段名1[,字段名2...字段名n]));
示例:
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> unique (e_name,e_sex));
已有表添加唯一约束:
alter table <表名> add [constraint 唯一约束名] unique (字段名);
示例:
-- 创建表
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
-- 添加唯一约束
mysql> alter table employee add unique(e_name);
删除唯一约束:
alter table <表名> drop index <唯一约束名>;
如果单个字段没有指定唯一约束名,则默认的唯一约束名为字段名。如果是多个字段组合为唯一约束时候,默认的唯一约束名为第一个字段的名称。如果指定了约束名,则删除的时候写约束名。
示例:
alter table employee drop index e_name;
创建自动增长约束:
creat table <表名> (
<字段名1> <字段类型1> primary key auto_increment,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>);
示例:
mysql> create table employee(
-> e_id int primary key auto_increment,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
已有表添加自动增长约束:
alter table <表名> modify <字段名> <字段类型> auto_increment;
示例:
-- 创建无自增约束的表
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
-- 添加自增约束
alter table employee modify e_id int auto_increment;
设置自动增长初始值:
alter table <表名> auto_increment=初始值;
示例:
alter table employee auto_increment=1000;
删除自增约束:
alter table <表名> modify <字段名> <字段类型>;
示例:
alter table employee modify e_id int;
域完整性是针对单元格的约束,不与其它行参考比较。
创建非空约束:
creat table <表名> (
<字段名1> <字段类型1> not null,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>);
示例:
mysql> create table employee(
-> e_id int,
-> e_name varchar(5) not null,
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
已有表添加非空约束:
alter table <表名> modify <字段名> <字段类型> not null;
示例:
-- 创建表
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
-- 添加非空约束
alter table employee modify e_name int not null;
删除非空约束:
alter table <表名> modify <字段名> <字段类型> [null];
示例:
alter table employee modify e_name int;
创建默认约束:
creat table <表名> (
<字段名1> <字段类型1> default value,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>);
示例:
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int default 0,
-> d_id int);
已有表添加默认约束:
alter table <表名> modify <字段名> <字段类型> default value;
示例:
-- 创建表
mysql> create table employee(
-> e_id int,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
-- 添加默认约束
alter table employee modify e_age int default 0;
删除默认约束:
alter table <表名> modify <字段名> <字段类型>;
示例:
alter table employee modify e_age int;
参照完整性指多表之间的对应关系,在一张表中执行数据插入、更新、删除等操作时,DBMS都会跟另一张表进行对照,避免不规范的操作,以确保数据存储的完整性。
创建外键约束:
creat table <表名> (
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>,
[constraint 外键约束名] foreign key(字段名) references <主表>(主键字段));
示例:
-- 创建一个主表
mysql> create table department(
-> d_id int primary key,
-> d_name varchar(5),
-> d_num int);
-- 创建从表的同时添加外键
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> foreign key(d_id) references department(d_id));
已有表中添加外键约束:
alter table <表名> add [constraint 外键约束名] foreign key(字段名) references <主表>(主键字段);
示例:
-- 创建一个主表
mysql> create table department(
-> d_id int primary key,
-> d_name varchar(5),
-> d_num int);
-- 创建从表
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
-- 添加外键约束
mysql> alter table employee add constraint fk_d_id foreign key(d_id) references department(d_id));
在有外键约束的表中导入数据时,如果数据不完整就会触发外键约束,这种情况下可以使用FOREIGN_KEY_CHECKS设置是否检查外键约束。
set FOREIGN_KEY_CHECKS=0; #在导入前设置为不检查外键约束
set FOREIGN_KEY_CHECKS=1; #在导入后恢复检查外键约束
删除外键约束:
alter table <表名> drop foreign key <外键约束名>;
示例:
alter table employee drop foreign key fk_d_id;
根据用户实际的完整性要求来定义,在执行数据插入、更新等操作时,DBMS会检查数据是否满足检查约束中的限定条件,避免不符合条件的操作,以保证数据存储的准确性。
创建检查约束:
creat table <表名> (
<字段名1> <字段类型1>,
<字段名2> <字段类型2>,
……
<字段名n> <字段类型n>,
check(<限定条件>));
示例:
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int,
-> check(e_age>=0));
已有表添加检查约束:
alter table <表名> add constraint <检查约束名> check(<限定条件>);
示例:
-- 创建表
mysql> create table employee(
-> e_id int primary key,
-> e_name varchar(5),
-> e_sex varchar(5),
-> e_age int,
-> d_id int);
-- 添加检查约束
mysql> alter table employee add constraint ch_e_age check(e_age>=0));
删除检查约束:
alter table <表名> drop constraint <检查约束名>;
示例:
mysql> alter table employee drop constraint ch_e_age;