SQL语句证明候选键约束包含在R(ABCD)中

时间:2019-01-27 12:43:41

标签: sql database candidate-key

如何编写一条SQL语句,证明给定与属性ABCD和功能依赖项A→B的关系,候选关键字ACD持有? 我知道这里有类似的内容:SQL statement to prove that A->B in a R(ABCD), 但无法弄清楚如何为此约束编写查询。

1 个答案:

答案 0 :(得分:0)

\i tmp.sql
create table abcd(
        a integer not null
        ,b integer not null
        ,c integer not null
        ,d integer not null
        -- , PRIMARY KEY (a,b,c,d)
        );
INSERT INTO abcd(a,b,c,d)
select (s/4)%4, (s/4)%2,(s/2)%2,s%2
from generate_series(0,15) s
        ;
select *from abcd;

ALTER TABLE abcd ADD UNIQUE (a,b,c,d); --succeeds
ALTER TABLE abcd ADD UNIQUE (a,c,d); --succeeds
ALTER TABLE abcd ADD UNIQUE (b,c,d); --fails

结果:


DROP SCHEMA
CREATE SCHEMA
SET
CREATE TABLE
INSERT 0 16
 a | b | c | d 
---+---+---+---
 0 | 0 | 0 | 0
 0 | 0 | 0 | 1
 0 | 0 | 1 | 0
 0 | 0 | 1 | 1
 1 | 1 | 0 | 0
 1 | 1 | 0 | 1
 1 | 1 | 1 | 0
 1 | 1 | 1 | 1
 2 | 0 | 0 | 0
 2 | 0 | 0 | 1
 2 | 0 | 1 | 0
 2 | 0 | 1 | 1
 3 | 1 | 0 | 0
 3 | 1 | 0 | 1
 3 | 1 | 1 | 0
 3 | 1 | 1 | 1
(16 rows)

ALTER TABLE
ALTER TABLE
ERROR:  could not create unique index "abcd_b_c_d_key"
DETAIL:  Key (b, c, d)=(0, 0, 0) is duplicated.

B在功能上取决于A,但是多个A可以指向相同的B值。

顺便说一句:IMO无法在SQL中进行验证(取决于表中的当前数据),但是有可能拒绝它。 (通过撰写示例)