数据库系统中用户定义的完整性规则示例?

时间:2011-01-15 12:59:57

标签: database relational-database entity-relationship

嘿大家好我目前正在准备考试,并希望了解数据库系统中用户定义的完整性规则的一些示例。据我了解,这意味着我可以为列设置某些条件,当插入数据时,它需要满足这些条件。

例如:如果我设置一个规则,ID只需要包含5个整数,那么当我插入一个ID由整数和一些字符组成的行时,它就不会接受它并返回错误

有人可以确认并给我一些意见吗?非常感谢你提前!

3 个答案:

答案 0 :(得分:6)

是的,这是数据库的全部概念,而不是不受控制的数据存储位置。

它们不是用户定义的,它们是定义的数据建模器或数据库管理员或数据库所有者(所有特定术语)。如果你把它留给用户或开发者,他们会免费阅读垃圾或互联网,并实施怪物。

30多年来,数据库的概念是它的整个定义是数据库中。在此期间,出现了许多标准(来自国际标准机构,而非来自单一供应商或软件销售商),这些标准逐步确定了各种标准以提升数据库的完整性。 SQL供应商已经实现了它们(好吧,不是免费软件,但它们不提供ISO / IEC / ANSI SQL;它们在这些产品中使用标准术语“SQL”是欺诈性的。)

在标准SQL中,我们有以下内容,如声明(即数据库外的代码,触发器):

  • 参照完整性。在插入子行之前,子项引用的父行必须存在。这恰好是关系定义,所以没有加倍。

  • 数据完整性。各种形式:

    • 首先确保使用正确的数据类型。始终如一。这消除了将字符值放在整数列中; 4位数列中的10位数值等
    • 规则。这些确保遵守列的所有规则(例如您的示例)。
    • 检查约束条件。这些允许在允许插入之前,针对其他列检查列值。它们可以简单或复杂。
    • (使用触发器,您可以实现上述声明不提供的任何进一步约束) 。
  • 交易诚信。这样可以确保维护不同表中行之间的完整性,并且可以依赖数据。

我再说一遍,如果它没有实现这些基础(在每一列上),它就不是一个数据库,它只是一个存储位置,对于没有完整性的数据。

您可以通过查看一些标准SQL手册或SQL标准本身(两者都可以在互联网上免费获得)轻松确认。

在互联网上发现的与上述相反的任何信息都不值得回应。

  • 任何带键盘和连接的坚果盒最近都可以发布任何东西。 Wiki由不合格的业余爱好者编写,“定义”每周都在变化,因为不太合格的业余爱好者会对其进行编辑。
  • 他们中的大多数人正在撰写他们所信仰的内容,没有任何实际经验,测试或验证他们的信仰。

与标准争论是浪费时间;他们有目的;他们是由比我们更大的思想创造出来的;他们长期(30年!)被大型组织和政府接受(要求)。小型组织可以通过遵循这些标准来节省时间,而不是相信它们在某种程度上“不同”。我们正在处理这个行业的物理科学和技术,而不是神奇的思维。

应用层中的业务规则

  1. 好吧,如果您将规则放在服务器中,它们将由服务器保证。我相信任何一天,任何应用程序层的完美执行,尤其是那些不了解数据库或其目的的人所写的。

  2. 数据库应该完全独立于使用它们的应用程序(注意复数)。将这些规则放在数据库中的五个应用程序而不是一个地方是愚蠢的。当规则发生变化时会发生什么,任何人都可以保证所有应用程序都能正确升级,并且一致吗?

  3. 还要记住,数据是公司资产,而不是部门资产。该公司实施标准,以便他们可以避免部门管理员浪费时间浪费30年前在他们的部门之外解决的愚蠢论据。

  4. 再次,人们发布他们的想法,好像他们是第一个经历这个思考过程的人,没有任何资格(这意味着他们知道标准)或理解或实际经验(这将改变他们的信仰真实快)。

    因此:所有与数据有关的业务规则,无论以何种形式或形式,都应与IEC / ISO / ANSI标准目录中的数据一起放在数据库中。

    任何业务逻辑(依赖于应用程序和使用情况)都可以放在业务决策的任何地方。这样,公司资产的完整性得以保留,损害仅限于招待神奇思维的部门。

答案 1 :(得分:1)

这些是Oracle中的CHECK约束,您可以这样定义它们:

alter table mytable add constraint mytable_id_chk check (length(id) = 5);

答案 2 :(得分:1)

MySQL还没有尊重Check约束。它在Create Table语句中解析它们但不尊重它们。因此,在MySQL中,您必须实现触发器中提到的排序数据完整性规则。

检查约束是正确的SQL工具,用于实现您提到的类型和大多数大型供应商(DB2,SQL Server,Postgres和是Oracle)的数据完整性检查,实现并遵守Check约束。但是,某些类型的约束(例如可能需要查询另一个表或复杂逻辑的约束)只能在触发器中实现。

Maintaining Data Integrity Through Constraints

Data Integrity