所以我最近在我的数据库课程中学到了ASSERTION,我的教授指出主要的数据库不支持它,即使它是在SQL-92标准中。我试图谷歌搜索找出原因,但似乎没有任何关于这个主题的讨论。
那么,为什么绝大多数关系数据库包都不支持ASSERTION?它是一个性能问题还是存在一些本质上难以解决的问题?
如果可以,请注意任何实现它的数据库包(例如:如果有学术/教学数据库)。另外,为什么关于这个问题的讨论很少;它甚至没有在维基百科页面中提到SQL或SQL-92)但是首先回答主要问题,或者在评论中回答。
我不正在寻找如何使用触发器或其他任何方式实现它。
答案 0 :(得分:28)
答案 1 :(得分:4)
我的2便士:
修改:我的意思在这些链接中有所描述:Scalar UDFs wrapped in CHECK constraints are very slow and may fail for multirow updates和来自Tony Rogerson
性能:10k行插入需要10k udf样式的执行,每个执行都有表访问权限。哎哟。鉴于ASSERTION是每行,那么这就是它的运作方式。如果它可以用于“INSERT中的所有行”,那么它作为触发器更简单,不是吗?
设计:有一些模式(超级键,子类型表等),用于使用更简单的约束来维护相关表的数据完整性。如果你需要检查一些随机表的数据完整性,我会说你有问题......
答案 2 :(得分:3)
答案 3 :(得分:1)
Oracle 10g中有一些基本的支持:
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_assert.htm
我敢肯定,其他具有存储过程支持的RDBMS附带了类似的内置程序......显然,这不是任何SQL标准的一部分。该标准确实指定:
<assertion definition> ::=
CREATE ASSERTION <constraint name> <assertion check>
[ <constraint attributes> ]
<assertion check> ::=
CHECK <left paren> <search condition> <right paren>
见http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
的第11.34章我不确定CREATE ASSERTION
声明。到目前为止,我还没有在任何RDBMS中遇到它,我认为很多RDBMS实际上并没有实现它。另一方面,单个表列上的CHECK
子句也可以被视为断言。
答案 4 :(得分:1)
是的,几个月前我在课堂上向我的导师提出了这个问题。它可能符合标准,但许多DBMS供应商根本不遵守标准。
可能DBMS不支持断言的原因是它是一个非常昂贵的操作,没有人会因此而使用它。
为了提供便捷的方式,DBMS实施了TRIGGER
和CHECK
s。通过这种方式,没有人确实需要断言。
答案 5 :(得分:1)
“如果可以,请注意任何实现它的数据库包”
SIRA_PRISE完全支持此功能。披露:我是作者。
(至于实际问题“为什么不是DBMS供应商提供此服务”:你真的要问供应商,但是(a)甚至是非常难以解决的问题在一个真正的关系系统中,(b)SQL远远不是真正的关系,并且(c)很可能大多数程序员认为自己有足够的能力来实现与使用声明性ASSERTIONS相同的效果,从而严重加剧了复杂性。触发器,并且开销成本不是那么高。)
答案 6 :(得分:0)
Oracle正在考虑将此作为12c版本2之后的下一版本的可能增强功能,请参阅2016年5月由Toon Koppelaars撰写的this post。
如果您对该功能感兴趣,我建议对其进行推荐。