关系代数中并集运算产生的关系中的主键

Dan*_*and 5 union relational-theory

我对关系代数中联合运算的结果表/关系有疑问。结果关系没有主键吗?或者它返回一个带有隐藏主键的表?

示例:假设我们取以下两个表的并集:

R1:
id | name
----------
1    a
2    b
3    c

R2:
id | name
----------
1    b
2    c
3    d
Run Code Online (Sandbox Code Playgroud)

其中属性“id”是关系 R1 和 R2 中的主键,现在这两者的并集将是:

id | name
------------
1     a
1     b
2     b
2     c
3     c
3     d
Run Code Online (Sandbox Code Playgroud)

现在,结果关系中的任何属性都不能成为主键,因为 id 和 name 都包含重复项。DBMS 如何解决这个问题?

mir*_*173 5

根据定义,两个关系的并集不包含重复项。所以它至少包含一个候选键,所有属性的组成。在您的示例中(id, name)是一个候选键。

DBMS 不会通过分配主键来“解决”问题,因为在几乎所有 DBMS (至少是使用 SQL 的 DBMS)中,两个表的并集是派生表(或视图或 CTE,但不是基表)并且主键(1)只能为基表定义(不能为视图、派生表和公用表表达式定义)

尽管如此,DBMS 优化器通常知道由联合产生的派生表没有重复项,并且所有属性的组合唯一地定义了一行,并且可以在表的后续操作中使用这一事实(例如,在更复杂的查询中,其中该联合与其他表连接或联合)

(1):一般性限制。有一个通用的 SQL 约束构造 ( CREATE ASSERTION),它允许跨多个表进行约束,可用于在联合上创建唯一约束,但断言尚未被任何主要 DBMS 实现 - 可能是因为这是一个非常复杂的问题。Firebird 声称拥有它们,但不确定效果如何或有哪些限制。