数据完整性分为三个方面:
1、域完整性(列)
限制输入数据的类型,及范围,或者格式,如性别字段必须是“男”或者“女”,不允许其他数据插入,成绩字段只能是0-100的整型数据,email字段的内容必须符合邮箱的正则表达式
2、实体完整性(行)
要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列,也可能是几列的组合,称为主键。也就是说,表中的主键在所有行上必须取唯一值。
3、参照完整性(表)
参照完整性是基于外键与主键之间的关系,从表中的外键必须在主表中存在数据,不能引用主表中不存在的主键值,在输入更改或者删除主表数据时,从表需要联动变化,保证了数据的一致性。
根据以上概念,对于数据的完整性校验是从 “列”、“行”、“表” 的维度进行的。
有些约束是在建表的时候就已经根据数据库定义语言DDL语句进行了约束。
1、域完整性约束
强制域完整性的方法有:限制类型(通过设定列的数据类型)、格式(通过CHECK约束和规则)或可能值的范围(通过FOREIGN KEY约束、CHECK约束、DEFAULT定义、NOT NULL定义和规则)
2、实体完整性约束
强制实体完整性的方法有:索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性。
3、参照完整性约束
强制参照完整性的方法有:主外键关系
校验点分析:
可以看到其实实体完整性是肯定符合的,因为没有主键是不能建表的,参照完整性约束在建表时一般也会进行约束,校验的重点在于域完整性校验,即校验列数据的内容,有时候建表时不会增加CHECK约束(下面会举例),
所以不能保证入库的数据就是你想要的,假如没有约束性别字段只能为”男”或者“女”,而你又需要统计男女比例分布,万一爬虫数据写入了其他值,则统计结果肯定就不准确了。
例子:
CHECK约束(mysql)
在 "Persons" 表创建时在 "P_Id" 列上创建 CHECK 约束。CHECK 约束规定 "P_Id" 列必须只包含大于 0 的整数。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
域完整性校验实例:
使用robot framework编写的自动化测试脚本
*** Settings ***
Library DatabaseLibrary
Library re
*** Test Cases ***
域完整性校验
[Documentation] 脚本解释:
...
... 1、连接数据库,读取主键id和email字段的值
...
... 2、遍历email的所有值,校验是否符合邮箱格式的正则表达式,如果不符合用例失败,打印错误信息
Connect To Database Using Custom Params pymysql database='test_platform',user='root',password='guchen',host='192.168.202.80',port=3306
${table} Set Variable account_user
${primary_key} Set Variable id
${column} Set Variable email
@{result} Query select ${primary_key},${column} from ${table}
Log Many @{result}
: FOR ${li} IN @{result}
\ log ${li[1]} #${li[1]}为获取到的邮箱
\ Run Keyword If '${li[1]}' == '' log 数据为空
\ ... ELSE Should Match Regexp ${li[1]} ^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$ msg=${table}表中,${primary_key}为${li[0]}的行数据${column}字段的值:${li[1]}数据格式不正确,非邮箱格式。
\ ... #校验邮箱字段的值是否都符合邮箱格式
脚本解释:
1、连接数据库,读取主键id和email字段的值
2、遍历email的所有值,校验是否符合邮箱格式的正则表达式,如果不符合用例失败,打印错误信息