周谊 李国忠
摘 要:本文通过对MYSQL中设置的域完整性约束不能实现的介绍,分析完整性约束的实质问题,引入触发器的错误中止实例,并由此探讨域完整性约束的解决方案。
关键词:完整性;约束;MYSQL;CHECK;触发器
1 引言
一致性和准确性对数据库中的数据来说是非常重要的,对数据表设置数据完整性约束是数据库服务器的一项重要功能。如果定义了完整性约束,每次数据更新,数据库系统都会测试新的内容是否合符的完整性设置从而对表中的输入做出限制。
2 了解MYSQL中的完整性约束
数据完整性大致划分为四种类型:实体完整性、参照完整性、域完整性和用户定义完整性。
2.1 实体完整性
实体完整性保证每一个值都能由称为主键的属性来唯一标识。主键就是表中的一个或多个字段的组合值,其内容能唯一地标志表中的每一条记录。通过定义PRIMARY KEY约束来创建主键约束,其内容不能取空值。
2.2 参照完整性约束
参照完整性约束也被称为外键约束,参照完整性约束保证外键的值必须与主表中相关的主键值相匹配。通过定义REFERENCE_DEFINITION约束来创建外键约束。
2.3 域完整性约束
域完整性约束保证只在有效范围内的值才能存储到字段中,它可以通过限制数据类型、值域来实现。CHECK完整性约束就是通过设置值域来实现字段的取值范围。
2.4 用户定义完整性
用户定义完整性是由用户指定的一组规则来实现对数据的特定约束。
另在数据表中,唯一性约束像主键约束一样,是表的一个或多个字段的组合值,它们的值在任何时候都是唯一的。唯一性约束是没有被选做主键约束的候选约束。通过定义UNIQUE约束来创建唯一性约束,在一个数据表中唯一性约束可以有多个而主键约束只能有一个。
在MYSQL中完整性约束能够实现主键约束、参照完整性约束和唯一性约束,而CHECK会被忽略,且没有提供专门的用户自定义完整性窗口。
3 MYSQL中CHECK完整性约束实例
我们会发现记录能正常地输入到数据表中。在MYSQL中是這样规定的:能够接受对CHECK子句的分析,但是会被忽略。接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序创建带参考数据的表。
那么我们怎么样才能实现数据中域完整性的约束呢?
4 域完整性约束的实现
我们怎么解决这个问题呢,当输入的数据不符合要求时需要能够及时中止操作的进行,那么有两个条件:一是插入表的数据时能被激活,二是能够中止操作。
触发器是一种特殊的存储过程,在向表中插入、更新或删除记录时执行,以限制和检查数据的改变。触发器是不需要调用的,当对数据表进行插入、更新或删除事件时,它会被激活,由于与表的关系密切,用于保护表中的数据。
找到了激活的方式怎么才能中止错误的域输入呢?MYSQL系统并不返回CHECK错误,那么能不能自己人为地制造错误来中止操作——答案是肯定地,我们的解决方案就是添加一个INSERT触发器,在触发器中设置一个域条件来触发一个人为错误转向。
在这个触发器中判断输入的新记录中如果性别不在男女范围内,则向一个不存在的数据表中插入记录,当然也可以用其它的错误来中止继续。
如果是在软件编程中,我们可以通过触发器返回的错误号来转成真实的错误提示信息。
5 结论
在MYSQL中域完整性在系统完整性约束不能实现的情况下,我们还可以通过其它的途径来解决,只要我们正确分析解决问题所需具备的条件一步步进行下去就能找到解决方法。
[参考文献]
[1]郑阿奇.MySQL实用教程.电子工业出版社,2009.1.
[2]宋振会.SQL Server 2000中文版基础教程.清华大学出版社,2005.5.
[3]周谊,温且兵.在SQL Server中一类错误的避免.科技信息,2011.3.