数据完整性的概念

目的

为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时, DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确 保数据库中存储的数据正确、有效、相容。

概念

约束是用来确保数据的准确性和一致性。数据的完整性就是对数据的准确性和一致性的一种保证。

数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)

分类

1、数据实体完整性(唯一约束、主键约束、标识列)

2、字段完整性(限制数据类型、检查约束、外键约束、默认值、非空约束)

3、引用完整性(外键约束)

4、自定义完整性(规则、存储过程、触发器)

 

主键约束(PRIMARY KEY)

主键

主键是表中实现记录唯一性的字段

一个表中只能有一 个主键,如果建表的时候没有明确定义NOT NULL,

mysql会隐含的定义这些列 为NOT NULL。

特性:

1、唯一性

2、不能为NULL

语法

CREATE TABLE 表名(列名 数据类型,…..,PRIMARY KEY(主键名(列名)));

ALTER TABLE 表名 ADD PRIMARY KEY(主键名(列名));

ALTER TABLE 表名 ADD CONSTRAINT 主键名称 PRIMARY KEY(主键);

自动增长型(AUTO_INCREMENT) 

在数据库中,我们常用到唯一编号以表示记录,在mysql中 可以通过数据列的auto_increment属性来自动增长

应用于数值型

注意 添加自动增长的列,必须给主键约束

示例:

CREATE TABLE 表名(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR (20),
PRIMARY KEY (id)
)

修改自动增长列

ALTER TABLE 表名 AUTO_INCREMENT=值(从什么数值开始增长);

外键约束(FOREIGN KEY)

外键:

可以使得两张表关联,保证数据的一致性和实现一些级联操作

外键是子表里的一个字段,引用父表里的主键,一个被定义为外键的字段用于引用另一张表里的主键

语法:

ALTER TABLE 子表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键)  REFERENCES 主表名(主表中的主键);

例如:

ALTER TABLE students ADD CONSTRAINT FK_class FOREIGN KEY (class_id) REFERENCES class(class_id);

注意:

1、外键名取名规范:FK_主表名,能够保证数据的一致性

2、从表中的外键值必须在主表中存在,建立主外表关系时,必须存在主表。先建立主表,再是从表

3、删除带有主外键关系的表时,先删从表再删主表数据

4、再添加外键时,添加 on delete cascade 进行级联删除

5、工作时很少建立主外键关系,主外键关系的约束会影响到执行性能

要求:

A:两个表必须是innodb表。

B:外键列必须建立索引.

C:外键关系的两个表的列必须是数据类型相似,可以相互转换的, 比如(int 跟 tinyint)可以,而int跟char则是不可以的。

关键字:

foreign key(列名) 引用父表那列

references `父表表名`(`父表的列名`)

constraint 指定约束的名称。在数据库中应是唯一的。如果没有指定, 那么系统为默认给你生成一个约束名。

on delete /on update cascade 级联更新删除数据

唯一约束(UNIQUE)

唯一约束

唯一性要求表里某个字段的值在每条记录里都是唯一的。

语法

ALTER TABLE 表名 ADD CONSTRAINT 唯一约束名 UNIQUE (列名);(直接给原有列添加唯一约束)

CREATE TABLE 表名(列名1 数据类型1,...,列名n 数据类型n UNIQUE);(建表的时候添加唯一约束)

非空约束(NOT NULL)

NOT NULL

字段定义了NOT NULL那么该字段就不允许NULL值出现,也可以说是每个字 段都必须有值,没有指定的话就默认是NULL。

检查约束(CHECK) 

(这个好像在MySQL5.5版本无效,仅作了解)

自定义约束

CHECK

ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(表达式);

例如

ALTER TABLE students ADD CONSTRAINT CHK_age CHECK (s_age>18);

ALTER TABLE students ADD CONSTRAINT CHK_sex CHECK (s_sex in ('男',' 女'));

 

删除约束

删除主键时必须先删除自增长。

删除自增长

ALTER TABLE 表名 CHANGE 自增列 自增列 数据类型;

例如: ALTER TABLE color CHANGE color_id color_id int(20);

删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

例如: ALTER TABLE color DROP PRIMARY KEY;

删除约束

ALTER TABLE 表名 DROP CONSTRAINT 约束名;

删除外键

 ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

 

提醒:

实际工作中大部分的约束会在程序中解决,数据库中一般只用到 主键,自增,唯一,非空等约束。外键,检查用的很少。