例如:如果我设置一个规则,ID只需要包含5个整数,那么当我插入一个ID由整数和一些字符组成的行时,它就不会接受它并返回错误
有人可以确认并给我一些意见吗?非常感谢你提前!
答案 0 :(得分:6)
是的,这是数据库的全部概念,而不是不受控制的数据存储位置。
它们不是用户定义的,它们是定义的数据建模器或数据库管理员或数据库所有者(所有特定术语)。如果你把它留给用户或开发者,他们会免费阅读垃圾或互联网,并实施怪物。
30多年来,数据库的概念是它的整个定义是在数据库中。在此期间,出现了许多标准(来自国际标准机构,而非来自单一供应商或软件销售商),这些标准逐步确定了各种标准以提升数据库的完整性。 SQL供应商已经实现了它们(好吧,不是免费软件,但它们不提供ISO / IEC / ANSI SQL;它们在这些产品中使用标准术语“SQL”是欺诈性的。)
在标准SQL中,我们有以下内容,如声明(即数据库外的不代码,不触发器):
参照完整性。在插入子行之前,子项引用的父行必须存在。这恰好是关系定义,所以没有加倍。
数据完整性。各种形式:
我再说一遍,如果它没有实现这些基础(在每一列上),它就不是一个数据库,它只是一个存储位置,对于没有完整性的数据。
您可以通过查看一些标准SQL手册或SQL标准本身(两者都可以在互联网上免费获得)轻松确认。
在互联网上发现的与上述相反的任何信息都不值得回应。
与标准争论是浪费时间;他们有目的;他们是由比我们更大的思想创造出来的;他们长期(30年!)被大型组织和政府接受(要求)。小型组织可以通过遵循这些标准来节省时间,而不是相信它们在某种程度上“不同”。我们正在处理这个行业的物理科学和技术,而不是神奇的思维。
应用层中的业务规则
好吧,如果您将规则放在服务器中,它们将由服务器保证。我相信任何一天,任何应用程序层的完美执行,尤其是那些不了解数据库或其目的的人所写的。
数据库应该完全独立于使用它们的应用程序(注意复数)。将这些规则放在数据库中的五个应用程序而不是一个地方是愚蠢的。当规则发生变化时会发生什么,任何人都可以保证所有应用程序都能正确升级,并且一致吗?
还要记住,数据是公司资产,而不是部门资产。该公司实施标准,以便他们可以避免部门管理员浪费时间浪费30年前在他们的部门之外解决的愚蠢论据。
再次,人们发布他们的想法,好像他们是第一个经历这个思考过程的人,没有任何资格(这意味着他们知道标准)或理解或实际经验(这将改变他们的信仰真实快)。
因此:所有与数据有关的业务规则,无论以何种形式或形式,都应与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约束。但是,某些类型的约束(例如可能需要查询另一个表或复杂逻辑的约束)只能在触发器中实现。