~ MySQL 数据完整性

数据完整性,是指数据的准确性和一致性。如,学生的学号必须唯一、性别只能是男或女。

数据完整性,主要包括 4 种类型:

  • 域完整性:对字段(列)的约束,如数据类型、默认值约束、非空约束
  • 实体完整性:对记录(行)的约束,如主键约束、唯一值约束
  • 引用完整性:在输入和删除记录时,引用完整性保持表之间已定义的关系。如外键约束
  • 自定义完整性:用户自己定义的业务规则,如使用触发器实现自定义业务规则

数据库的数据完整性,关系到数据库系统能否真实的反映现实世界。因此,数据库是否具备数据完整性是非常重要的。


MySQL 提供了字段约束机制以保证数据的完整性,以下是一些常用的字段约束:


  • 默认值约束(default):赋予某个字段默认值,如果没有输入数据,则值就是默认值。
  • 外键约束(foreign key):用于建立表与表之间的关系,需要指定从表作为外键的字段引用主表的主键。需要注意的是,存储引擎:InnoDB 支持外键,外键关联的表要求都是 InnoDB 类型的表。

  • 主键约束(primary key):设置该字段为表的主键,作为该表数据记录的唯一标识。
  • 唯一值约束(unique):设置该字段的值是唯一的;允许为空,但只能有一个空值。

  • 非空约束(not null):对不允许为空的字段进行设置。
  • 自动增长约束(auto_increment):设置该字段自动增长,默认每条自增 1;通常用于设置主键,且为整数类型;可以设置初始值和步长。

[ 实现方式 ] 简单来说,为了对各字段的数据做进一步的确定,可以通过对字段设置字段约束来实现数据完整性:

完整性类型:              // MySQL 不支持 check 约束, 虽然可以在列上添加 check 约束,但不起作用

域              ——>      约束类型:default(默认值约束)、check(检查约束)、foreign key(外键约束)

实体            ——>                    primary key(主键约束)、unique(唯一值约束)

参照            ——>                    foreign key(外键约束)


域完整性

  • 默认值约束

添加默认值约束

# 方式一:在创建表时,在字段后面直接添加默认值约束

create table book(
	book_id int primary key auto_increment,
	book_name varchar(50) default 'JAVA编程'
);

# 方式二:在表创建完成后,通过修改表结构添加默认值约束

create table book(
	book_id int primary key auto_increment,
	book_name varchar(50)
);
# 添加默认值约束
alter table book modify book_name varchar(50) default 'JAVA编程';

删除默认值约束

alter table book modify book_name varchar(50) default null;

  • 非空约束

添加非空约束

# 方式一:在创建表时,在字段后面直接添加非空约束

create table book(
	book_id int primary key,
	book_name varchar(50) not null
);

# 方式二:在表创建完成后,通过修改表结构添加非空约束

create table book(
	book_id int primary key,
	book_name varchar(50)
);
# 添加默认值约束
alter table book modify book_name varchar(50) not null;

删除非空约束

alter table book modify book_name varchar(50);

实体完整性

  • 主键约束 primary key

添加(复合)主键约束

# 方式一:创建一张表,并直接给字段添加主键约束

create table book(
	book_id int primary key,  # 在字段后面直接添加主键约束
	book_name varchar(50),
	book_price double
);

# 方式二:创建一张表,不在字段后面添加约束,而是在表的约束区域添加主键约束

create table book(
	book_id int,
	boot_name varchar(50),
	book_price double,
	# 在表的约束区域添加主键约束
	constraint pk_book_id primary key(book_id)
        # 说明:字段列表需要使用小括号,如果有多字段需要使用逗号分隔;声明两个以上字段为主键,我们称之为复合主键。
);

# 方式三:创建一张表,不写主键;而是在表创建完成后,通过修改表结构给某个字段添加主键约束

create table book(
	book_id int,
	book_name varchar(50),
	book_price double
);
# 在表创建完成后,给某个字段添加主键约束
alter table book add constraint pk_book_id primary key(book_id);

删除主键约束

alter table book drop primary key;

  • 自动增长约束

添加自动增长约束

# 方式一:在创建表的同时,在字段后面添加自动增长约束

-- create table book(
-- 	book_id int primary key auto_increment,
-- 	book_name varchar(50),
-- 	book_price double
-- );
# 插入数据
-- insert into book (book_name,book_price) values('书名1',9.9),('书名2',19.9); 

# 方式二:在表创建完成后,添加自动增长约束

create table book(
	book_id int primary key,
	book_name varchar(50),
	book_price double
);
# 为现有的表指定自增列
alter table book modify book_id int primary key auto_increment;

删除自动增长约束

alter table book modify book_id int primary key;

另,auto_increment 默认的开始值是 1,如果希望修改初始值,可以使用:

alter table book auto_increment=10;

  • 唯一值约束

添加唯一值约束

# 方式一:创建一张表,并直接给字段添加唯一值约束
 
create table book(
	book_id int unique,  # 在字段后面直接添加唯一值约束
	book_name varchar(50),
	book_price double
);
 
# 方式二:创建一张表,不在字段后面添加约束,而是在表的约束区域添加唯一值约束
 
create table book(
	book_id int,
	boot_name varchar(50),
	book_price double,
	# 在表的约束区域添加唯一值约束
	constraint unique_book_id unique(book_id)
);
 
# 方式三:创建一张表,然后,在表创建完成后,通过修改表结构给某个字段添加唯一值约束
 
create table book(
	book_id int,
	book_name varchar(50),
	book_price double
);
# 在表创建完成后,给某个字段添加唯一值约束
alter table book add constraint unique_book_id unique(book_id);

删除唯一值约束

alter table book drop index unique_book_id;

参照完整性

MySQL 参照完整性,一般是通过外键 foreign key 来实现的;外键仅 InnoDB 支持。

外键声明,需要指定从表作为外键的字段引用主表的主键;在删除主表时,必须删除引用关系或删除从表。

外键(foreign key)基本操作可以查看: MySQL 多表(外键)操作与多表查询