13 MySQL 从入门到精通——数据完整性约束

数据完整性约束:数据库中有很多数据,有些时候我们需要对这些数据进行限制,比如说这个数据的类型,例如时间类型如果你插入一个整数是不规范的;例如一些整型你插入的是字符串就会报错,等等这些我们都需要对数据进行约束,否则数据库中就会插入一些垃圾数据

定义完整性约束
	实体完整性:
		实体(Entity):是一个数据对象,是指客观存在并可以相互区分的事物,如一个教师、一个学生或一个雇员等。一个实体在数据库中表现为表中的一条记录。通常情况下,它必须遵守实体完整性规则。
		实体完整性规则(Entity Integrity Rule)是指关系的主属性,即主码(主键)的组成不能为空,也就是关系的主属性不能是空值(NULL)。关系对应于现实世界中的实体集,而现实世界中的实体是可区分的,即说明每个实例具有唯一性标识。
		实体完整性:可以通过两方面进行约束
			主键约束:
				1. 每一个表只能定义一个主键。
				2. 唯一性原则。主键的值,也称键值,必须能够唯一标识表中的每一行记录,且不能为NULL。也就是说一张表中两个不同的行在主键上不能具有相同的值。
				3. 最小化规则。复合主键(多个字段组成)不能包含不必要的多余列。也就是说,当从一个复合主键中删除一列后,如果剩下的列构成的主键仍能满足唯一性原则,那么这个复合主键是不正确的。
				4. 一个列名在复合主键的列表中只能出现一次。

				示例1:
					create table tb_user(
						id int auto_increment primary key,
						user varchar(30) not null,
						password varchar(30) not null,
						createtime datetime
					);
				示例2
					create table tb_student (
						id int auto_increment,
						name varchar(30) not null,
						sex varchar(2),
						classid int not null,
						birthday date,
						PRIMARY KEY (id,classid)
					);
				候选键约束:
					1. 候选键可以是表中的某一列,也可以是表中多个列所构成的一个组合。
					2. 候选键的值必须是唯一的,且不能为空(NULL)。
				主键约束与候选键约束区别:
					一个表中只能创建一个主键但是可以创建多个候选键
					定义主键时系统会自动创建primary key,定义候选键时系统会自动unic索引
					
					示例
						create table tb_user1(
							id int auto_increment UNIQUE,
							user varchar(30) not null UNIQUE,
							password varchar(30) not null,
							createtime TIMESTAMP default CURRENT_TIMESTAMP
						);
参照完整性:就是定义外码(外键)和主码(主键)之间的引用规则,它是对关系间引用数据的一种限制。用户定义完整性,在MySQL中目前只有InnoDB引擎类型支持外键约束
	设置外键时,通常需要遵守以下规则
		被参照表必须是已经存在的,或者是当前正在创建的表。如果是当前正在创建的表,也就是说,被参照表与参照表是同一个表,这样的表称为自参照表(Self-referencing Table),这种结构称为自参照完整性(Self-referential Integrity)。
		必须为被参照表定义主键。
		必须在被参照表名后面指定列名或列名的组合。这个列或列组合必须是这个被参照表的主键或候选键。
		外键中列的数目必须和被参照表中的列的数据相同。
		外键中列的数据类型必须和被参照表的主键(或候选键)中的对应列的数据类型相同。
		尽管主键是不能够包含空值的,但允许在外键中出现一个空值。这意味着,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
	
		Usage:
			[CONSTRAINT <symbol>] FOREIGN KEY (index_col_name,...) reference_definition
				reference_definition用法:主要定义外键所参照的表、列、参照动作的声明和实施策略等4部分:
					references tbl_name[(index_col_name,...)] #参考的表、列
					[ON DELETE reference_option]
					[ON UPDATE reference_option]
						index_col_name用法:
							col_name[(length)] [ASC|DESC]
						reference_option用法:指定参照完整性约束的实现策略
							restrict:限制策略,当要删除被参照表中的被参照的列上、在外键中出现的值时,拒绝操作
							cascade:级联策略,从被参照表中删除或更新数据时,自动删除或更新参照表中数据
							set null:置空策略,从被参照表中删除或更新数据时,设置参照表中对应外键值为NULL,前提这一列没有声明not null
							no action:不采取实施策略,等同于resirict
							
		
		示例:创建两个表,其中tb_student1表中的外键classid指向tb_class的id,因此此规则设置后tb_student1想要插入数据时classid的值必须在tb_class表的id中存在否则会报错,同样如果想要直接删除tb_class表中的数据,那么在tb_student1表中的classid必须没有与tb_class的id与之对应的只,不然需要先删除tb_student1表中的classid的相应的值
			CREATE TABLE tb_class(
				id int(11) NOT NULL AUTO_INCREMENT,
				name varchar(45) NOT NULL,
				PRIMARY KEY (`id`)
			);

			create table tb_student1 (
				id int auto_increment,
				name varchar(30) not null,
				sex varchar(2),
				classid int not null,
				birthday date,
				remark varchar(100),
				primary key (id),
				FOREIGN KEY (classid)	#设置外键为ckassid
				REFERENCES tb_class(id)	#指向tb_class表中的id字段
				ON DELETE RESTRICT	#删除限制
				ON UPDATE RESTRICT	#修改限制
			);
用户定义完整性规则:是针对某一应用环境的完整性约束条件,它反映了某一具体应用所涉及的数据应满足的要求,主要有以下三种规则
	非空约束
	CHECK约束:如果一个字段有一定的范围就可以用CHECK约束例如年龄约束为1-130,以下是它的两种约束
		对列实施CHECK约束
		对表实施CHECK约束
	触发器
		
		示例1:对列实施CHECK约束
			create table tb_student2 (
				id int auto_increment,
				name varchar(30) not null,
				sex varchar(2),
				age int not null CHECK(age>6 and age<18),
				remark varchar(100),
				primary key (id)
			);
							
		示例2:对表实施CHECK约束
			create table tb_student3 (
				id int auto_increment,
				name varchar(30) not null,
				sex varchar(2),
				classid int not null,
				birthday date,
				remark varchar(100),
				primary key (id),
				CHECK(classid IN (SELECT id FROM tb_class)) #或者CHECK(classid IN (1,2)),表示列表值只能是1或2
			);			
		
		
命名完整性约束
		Usage:
			CONSTRAINT <symbol> [PRIMAR KEY 短语 |FOREIGN KEY 短语 |CHECK 短语]
				#symbol:用于指定约束名称。这个名字是在完整性约束说明的前面被定义,在数据库里必须是唯一的。如果在创建时没有指定约束的名字,则MySQL将自动创建一个约束名字。

		示例:
			create table tb_student1a (
				id int auto_increment PRIMARY KEY,
				name varchar(30) not null,
				sex varchar(2),
				classid int not null,
				birthday date,
				remark varchar(100),
				CONSTRAINT fk_classid FOREIGN KEY (classid)	#约束名为fk_classid
				REFERENCES tb_class(id)
				ON DELETE RESTRICT
				ON UPDATE RESTRICT
			);

更新完整性操作
	删除完整性约束
		示例:
			alter table tb_studentla drop foreign key fk_classid;
	修改完整性约束:在mysql中完整性约束是不能直接被修改的,想要修改必须先删除在增加一个同名的约束
		alter table tb_studentla add constraint fk_classid foreign key (classid) 
		references tb_class(id)
		on delete cascade
		on update cascade
		;


	



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值