數據完整性分為三個方面:
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的所有值,校驗是否符合郵箱格式的正則表達式,如果不符合用例失敗,打印錯誤信息