周誼 李國忠
摘 要:本文通過對MYSQL中設置的域完整性約束不能實現的介紹,分析完整性約束的實質問題,引入觸發(fā)器的錯誤中止實例,并由此探討域完整性約束的解決方案。
關鍵詞:完整性;約束;MYSQL;CHECK;觸發(fā)器
1 引言
一致性和準確性對數據庫中的數據來說是非常重要的,對數據表設置數據完整性約束是數據庫服務器的一項重要功能。如果定義了完整性約束,每次數據更新,數據庫系統(tǒng)都會測試新的內容是否合符的完整性設置從而對表中的輸入做出限制。
2 了解MYSQL中的完整性約束
數據完整性大致劃分為四種類型:實體完整性、參照完整性、域完整性和用戶定義完整性。
2.1 實體完整性
實體完整性保證每一個值都能由稱為主鍵的屬性來唯一標識。主鍵就是表中的一個或多個字段的組合值,其內容能唯一地標志表中的每一條記錄。通過定義PRIMARY KEY約束來創(chuàng)建主鍵約束,其內容不能取空值。
2.2 參照完整性約束
參照完整性約束也被稱為外鍵約束,參照完整性約束保證外鍵的值必須與主表中相關的主鍵值相匹配。通過定義REFERENCE_DEFINITION約束來創(chuàng)建外鍵約束。
2.3 域完整性約束
域完整性約束保證只在有效范圍內的值才能存儲到字段中,它可以通過限制數據類型、值域來實現。CHECK完整性約束就是通過設置值域來實現字段的取值范圍。
2.4 用戶定義完整性
用戶定義完整性是由用戶指定的一組規(guī)則來實現對數據的特定約束。
另在數據表中,唯一性約束像主鍵約束一樣,是表的一個或多個字段的組合值,它們的值在任何時候都是唯一的。唯一性約束是沒有被選做主鍵約束的候選約束。通過定義UNIQUE約束來創(chuàng)建唯一性約束,在一個數據表中唯一性約束可以有多個而主鍵約束只能有一個。
在MYSQL中完整性約束能夠實現主鍵約束、參照完整性約束和唯一性約束,而CHECK會被忽略,且沒有提供專門的用戶自定義完整性窗口。
3 MYSQL中CHECK完整性約束實例
我們會發(fā)現記錄能正常地輸入到數據表中。在MYSQL中是這樣規(guī)定的:能夠接受對CHECK子句的分析,但是會被忽略。接受這些子句但又忽略子句的原因是為了提高兼容性,以便更容易地從其它SQL服務器中導入代碼,并運行應用程序創(chuàng)建帶參考數據的表。
那么我們怎么樣才能實現數據中域完整性的約束呢?
4 域完整性約束的實現
我們怎么解決這個問題呢,當輸入的數據不符合要求時需要能夠及時中止操作的進行,那么有兩個條件:一是插入表的數據時能被激活,二是能夠中止操作。
觸發(fā)器是一種特殊的存儲過程,在向表中插入、更新或刪除記錄時執(zhí)行,以限制和檢查數據的改變。觸發(fā)器是不需要調用的,當對數據表進行插入、更新或刪除事件時,它會被激活,由于與表的關系密切,用于保護表中的數據。
找到了激活的方式怎么才能中止錯誤的域輸入呢?MYSQL系統(tǒng)并不返回CHECK錯誤,那么能不能自己人為地制造錯誤來中止操作——答案是肯定地,我們的解決方案就是添加一個INSERT觸發(fā)器,在觸發(fā)器中設置一個域條件來觸發(fā)一個人為錯誤轉向。
在這個觸發(fā)器中判斷輸入的新記錄中如果性別不在男女范圍內,則向一個不存在的數據表中插入記錄,當然也可以用其它的錯誤來中止繼續(xù)。
如果是在軟件編程中,我們可以通過觸發(fā)器返回的錯誤號來轉成真實的錯誤提示信息。
5 結論
在MYSQL中域完整性在系統(tǒng)完整性約束不能實現的情況下,我們還可以通過其它的途徑來解決,只要我們正確分析解決問題所需具備的條件一步步進行下去就能找到解決方法。
[參考文獻]
[1]鄭阿奇.MySQL實用教程.電子工業(yè)出版社,2009.1.
[2]宋振會.SQL Server 2000中文版基礎教程.清華大學出版社,2005.5.
[3]周誼,溫且兵.在SQL Server中一類錯誤的避免.科技信息,2011.3.