MySQL中的数据完整性约束

MySQL中的数据完整性约束

预备阅读:MySQL中常用的数据类型 MySQL中表的操作

前言

前面已经学习了常用数据类型和表的操作,其中表的操作中提到了数据完整性约束条件,今天来详细说一下各种完整性约束条件。

关系模型的完整性规则是对关系的某种约束条件。对关系模型施加完整性约束,是为了在数据库应用中保障数据的正确性和一致性,防止数据库中存在不符合语义、不正确的数据,这也是数据库服务器最重要的功能之一。

完整性约束既能防止对MySQL数据库的意外破坏和非法存取,又能提高完整性检测效率,也能减轻我们的负担。下面说一下关系模型中的三类完整性约束。


定义实体完整性

实体完整性规则(Entity Integrity Rule)是指关系的主属性不能取空值,即主键和候选键在关系中所对应的属性都不能取空值。MySQL中实体完整性就是通过主键约束和候选键约束来实现的。

1、主键约束

主键是表中某一列或某些列所构成的一个组合。能够唯一地标识表中的一条记录。主键约束(Primary Key Constraint)要求主键列的数据唯一,且不允许为空。

主键约束实现的两种方式:

  • 一种是列级完整性约束,在表中某个字段定义后加上关键字PRIMARY KEY即可。如studentNo char(10) PRIMARY KEY,。

  • 一种是表级完整性约束,需要在表中所有字段定义最后添加一条PRIMARY KEY(index_col_name, ...)。如PRIMARY KEY(studentNo)。

比如我们重新创建学生表:

CREATE TABLE tb_student(

studentNo CHAR(10) PRIMARY KEY,

studentName VARCHAR(20) NOT NULL,

sex CHAR(2),

birthday DATE,

native VARCHAR(20),

nation VARCHAR(20),

classNo CHAR(6)

)ENGINE=InnoDB;

2、完整性约束的命名

与数据库中的表一样,可以对完整性约束进行添加、删除和修改等操作。首先需要在定义约束时对其进行命名,命名完整性约束的方法是,在各种完整性约束的定义说明之前加关键字CONSTRAINT和该约束的名字,语法格式如下:

CONSTRAINT<symbol>

{PRIMARY KEY (主键字段列表)

|UNIQUE (候选键字段列表)

| FOREIGN KEY (外键字段列表) REFERENCES tb_被参照关系(主键字段列表)

|CHECK(约束条件表达式)};

说明:symbol为指定的约束名字,必须是唯一的,默认MySQL会自动创建一个约束名字。

3、候选键约束

与主键一样,候选键可以是表中的某一列,也可以是表中某些列构成的一个组合。任何时候,候选键的值必须是唯一的,且不能为NULL,候选键可在CREATE TABLE 或ALTER TABLE语句中使用关键字UNIQUE来定义,实现方法与主键类似。看一个例子,创建班级表。

CREATE TABLE tb_class(

classNo CHAR(6) PRIMARY KEY,

className VARCHAR(20) NOT NULL UNIQUE,

department VARCHAR(30) NOT NULL,

grade SMALLINT,

classNum TINYINT

)ENGINE=InnoDB;

或者直接放在所有字段之后:CONSTRAINT UQ_class UNIQUE(className)。

MySQL中PRIMARY KEY 和UNIQUE之间的区别:

  • 一个表只能创建一个PRIMARY KEY,但是可以定义多个UNIQUE。

  • 定义PRIMARY KEY的列不允许有空值,定义UNIQUE的字段允许空值的存在。

  • 定义PRIMARY KEY约束时,系统会自动产生PRIMARY KEY索引,而定义UNIQUE约束时,系统自动产生UNIQUE索引。


定义参照完整性

关系模型中实体与实体间的联系都是用关系来描述,因此可能存在着关系与关系间的引用。外键是一个表中的一个或一组属性,他不是这个表的主键,但是它对应另一个表的主键,外键的主要作用就是保证数据引用的完整性,保持数据的一致性。

参照完整性规则(Referential Integrity Rule)定义的是外键与主键之间的引用规则,即外键的取值或者为空,或者等于被参照关系中某个主键的值。

下面修改一下前面的学生表。

DROP TABLE tb_student;

CREATE TABLE tb_student(

studentNo CHAR(10),

studentName VARCHAR(20) NOT NULL,

sex CHAR(2),

birthday DATE,

native VARCHAR(20),

nation VARCHAR(20),

classNo CHAR(6) REFERENCES tb_class(classNo),

CONSTRAINT PK_student PRIMARY KEY(studentNo)

)ENGINE=InnoDB;

前面已经创建了表tb_class,而且classNo是主键,这里学生表里可以设置为外键,这个值参照班级表的主键classNo的值。

PS.外键只能引用主键和候选键。外键只可以用在使用存储引擎InnoDB创建的表中,其他的存储引擎不支持外键。


用户定义的完整性

除了前面两种完整性之外,还有一种特殊的约束条件,即用户定义的完整性规则(User-definedIntegrity Rule),它反映了某一具体应用所涉及的数据应满足的语义要求。

MySQL支持以下几种用户自定义完整性约束:

1、设置非空约束

非空约束是指设置的字段的值不能为空。比如之前我们添加的字段:studentNameVARCHAR(20) NOT NULL,中就设置了非空约束。

2、CHECK约束

与非空约束一样,也是在创建表或修改表的同时来定义的。CHECK约束需要指定限定条件,CHECK的语法是CHECK(expr);下面看一下实例,我们来创建一个课程表tb_course,并且设置约束,每16个课时对应1学分。

CREATE TABLE tb_course(

courseNo CHAR(10),

courseName VARCHAR(20) NOT NULL,

credit INT NOT NULL,

courseHour INT NOT NULL,

term CHAR(2),

priorCourse CHAR(6),

CONSTRAINT PK_course PRIMARY KEY(courseNo),

CONSTRAINT FK_course FOREIGN KEY(priorCourse)

REFERENCES tb_course(courseNo),

CONSTRAINT CK_course CHECK(credit= courseHour/16)

)ENGINE=InnoDB;


更新完整性约束

1、删除约束

DROP TABLE会删除所有完整性,但是并不经常这样做。看一下单独删除的语法。

  1. 删除外键约束

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

  1. 删除主键约束

ALTER TABLE <表名> DROP PRIMARY KEY;

  1. 删除候选键约束

ALTER TABLE <表名> DROP {约束名|候选键字段名};

2、添加约束

创建表时一般会添加约束,如果没有添加的话,后期添加也是可以的。

  1. 添加主键约束

ALTER TABLE <表名> ADD [CONSTRAINT<约束名>] PRIMARY KEY(主键字段);

  1. 添加外键约束

ALTER TABLE <表名> ADD [CONSTRAINT<约束名>] FOREIGNKEY (外键字段) REFERENCES 被参照表(主键字段名);

  1. 添加候选键约束

ALTER TABLE <表名> ADD [CONSTRAINT<约束名>] UNIQUE KEY(字段名);

大家可以手动测试一下。


小结

今天主要讲一下MySQL中的数据完整性约束,方便下面的学习,熟悉之后,我们才能更好的应用于我们的数据库,用合适的完整性约束来规范我们的数据,这样不仅方便查找和操作,也方便后期的维护和优化。

希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。

如果想快速联系我,欢迎关注微信公众号:AiryData。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值