数据库完整性约束(基于MySQL)

1 实体完整性

实体完整性是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列,也可能是几列的组合,称为主键。也就是说,表中的主键在所有行上必须取唯一值

强制实体完整性的方法有:索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性。如:学生表中学号的取值必须唯一,它唯一标识了相应记录所代表的学生,学号重复是非法的。学生的姓名不能作为主键,因为完全可能存在两个学生同名同姓的情况。

1.1 主键(Primary Key)

主键(Primary Key):主键列的值不能为NULL,也不能重复。

例如,创建表,定义列时指定主键

CREATE TABLE stu ( 
  sid CHAR ( 6 ) PRIMARY KEY, 
  sname VARCHAR ( 20 ), 
  age INT, 
  gender VARCHAR ( 10 ) 
);

例如,创建表,定义列之后指定独立的主键

CREATE TABLE stu (
	sid CHAR ( 6 ),
	sname VARCHAR ( 20 ),
	age INT,
	gender VARCHAR ( 10 ),
    PRIMARY KEY ( sid ) 
);

如果创建表时没有指定主键,可以在修改表时定义主键:

ALTER TABLE stu ADD PRIMARY KEY ( sid );

删除主键(只是删除主键约束,而不会删除主键列)语法:

ALTER TABLE stu DROP PRIMARY KEY;

1.2 主键自增长

MySQL提供了主键自动增长的功能,这样用户就不用再为是否有主键重复而烦恼了。当主键设置为自动增长后,在没有给出主键值时,主键的值会自动生成,而且是最大主键值+1,也就不会出现重复主键的可能了。

例如,在创建表时设置主键自增长(主键必须是整型才可以自增长):

CREATE TABLE stu ( 
  sid INT PRIMARY KEY AUTO_INCREMENT, 
  sname VARCHAR ( 20 ), 
  age INT, 
  gender VARCHAR ( 10 ) 
);

在修改表时也可以设置主键自增长:

ALTER TABLE stu MODIFY sid INT AUTO_INCREMENT;

在修改表时删除主键自增长:

ALTER TABLE stu MODIFY sid INT;

2 域完整性

域完整性是指一个列的输入有效性,是否允许为空值。

强制域完整性的方法有:限制类型(通过设定列的数据类型)、格式(通过CHECK约束和规则)或可能值的范围(通过FOREIGN KEY约束、CHECK约束、DEFAULT定义、NOT NULL定义和规则)。如:学生的考试成绩必须在0~100之间,性别只能是“男”或“女”。

2.1 非空

指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列一定要给值;在修改记录时,不能把非空列的值设置为NULL。

例如,指定非空约束(NOT NULL):

CREATE TABLE stu ( z
  sid INT, 
  sname VARCHAR ( 10 ) NOT NULL, 
  age INT, 
  gender VARCHAR ( 10 ) 
);

当为sname字段指定为非空后,在向stu表中插入记录时,必须给sname字段指定值,否则会报错。

2.2 唯一

当为字段指定唯一约束后,那么字段的值必须是唯一的。这一点与主键相似!

例如:给stu表的sname字段指定唯一约束(UNIQUE)

CREATE TABLE tab_ab ( 
  sid INT, 
  sname VARCHAR ( 10 ) UNIQUE 
);

当两次插入相同的名字时,MySQL就会报错!

3 参照完整性

参照完整性是指保证主关键字(被引用表)和外部关键字(引用表)之间的参照关系。它涉及两个或两个以上表数据的一致性维护。外键值将引用表中包含此外键的记录和被引用表中主键与外键相匹配的记录关联起来。

在输入、更改或删除记录时,参照完整性保持表之间已定义的关系,确保键值在所有表中一致。这样的一致性要求确保不会引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。

参照完整性是基于外键与主键之间的关系。例如学生学习课程的课程号必须是有效的课程号,score表(成绩表)的外键cno(课程号)将参考course表(课程表)中主键cno(课程号)以实现数据完整性。

外键:主外键是构成表与表关联的唯一途径。外键是另一张表的主键。例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键,但是部门编号是部门表的主键。外键就是用来约束这一列的值必须是另一张表的主键值。

示例:创建t_user表,指定uid为主键列

CREATE TABLE t_user ( 
  uid INT PRIMARY KEY AUTO_INCREMENT, 
  uname VARCHAR ( 20 ) UNIQUE NOT NULL 
);

创建t_section表,指定sid为主键列,u_id为相对t_user表的uid列的外键:

CREATE TABLE t_section (
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR ( 30 ),
	u_id INT,
CONSTRAINT fk_t_user FOREIGN KEY ( u_id ) REFERENCES t_user ( uid ) 
);

或者可以在修改t_section表时,指定u_id为相对t_user表的uid列的外键:

ALTER TABLE t_section ADD CONSTRAINT fk_t_user FOREIGN KEY ( u_id ) REFERENCES t_user ( uid );

修改t_section表,删除u_id的外键约束:

ALTER TABLE t_section DROP FOREIGN KEY fk_t_user;

4 用户定义完整性

用户定义完整性:是根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。这一约束机制一般不应由应用程序提供,而应有由关系模型提供定义并检验,用户定义完整性主要包括字段有效性约束和记录有效性。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值