立即学习:https://edu.csdn.net/course/play/27328/362521?utm_source=blogtoedu
数据的完整性--存储在数据库中的数据应该保持一致性和可靠性
数据约束用于保证数据的完整性。
实体完整性-实际生活中的某个对象,保证每个实体都能被区别。如每个人的身份证号不一样。要求每张表都有唯一标识符,每张表中的主键字段不能为空且不能重复。--唯一、主键约束
唯一约束unique:数据库中同一个字段不可能存在相同的值,同一张表中可以加多个unique约束。
create table person(
id int not null auto_increment primary key comment '主键id',
name varchar(50),
sex tinyint default 1,
phone varchar(20),
id_number char(18) unique comment '身份证号'
) charset=utf8
;
mysql> desc person;
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| sex | tinyint(4) | YES | | 1 | |
| phone | varchar(20) | YES | | NULL | |
| id_number | char(18) | YES | UNI | NULL | |
外键约束:主表是学生表,有学号、姓名,从表是成绩表,有学号、foreign key(stu_no) references stu(stu_no) 是指学号引用了学生表的主键。如果要在从表中插入数据,必须先在主表中插入数据,否则从表里的外键不能引用不存在的数据。如果要删除,需要先删除从表中的数据,再删除主表的数据。
mysql> create table stu(
-> stu_id int not null auto_increment primary key comment '主键id',
-> name varchar(50)
-> ) charset=utf8;
Query OK, 0 rows affected (0.04 sec)
mysql> create table score(
-> id int not null auto_increment primary key comment '主键id',
-> stu_id int not null,
-> course varchar(50),
-> grade int,
-> foreign key(stu_id) references stu(stu_id)
-> ) charset=utf8;
Query OK, 0 rows affected (0.03 sec)
mysql> select * from stu;
+--------+------+
| stu_id | name |
+--------+------+
| 1 | zj |
| 2 | zd |
+--------+------+
2 rows in set (0.00 sec)
mysql> insert into score(stu_id,course,grade) values(1,'计算机',100),(3,'数学',87);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`score`, CONSTRAINT `score_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `stu` (`stu_id`))
参照完整性-表与表之间的关系,不允许引用不存在的实体。多表之间,比如成绩表需要插入某科成绩,插入的学号必须在学生表中是真实存在的。学号是成绩表的外键,是学生表的主键,必须存在这个编号才可以插入。
用户自定义完整性-某义打应用所涉及的数据必须满足的语义要求。比如设置了用户账户必须大于0,如果插入金额为负的话无法插入。借助存储过程和触发器实现
域完整性-对数据的列有要求,如数据类型,格式,值的范围等。如年龄不能是几千岁。针对具体关系数据库的约束条件,保证表中某些列不能输入无效的值。--如数据要求不超过8位,超过8位是无法插入的。