Оператор SQL, чтобы доказать, что ограничение ключа-кандидата выполняется в R (ABCD)

Как мне написать оператор SQL, который доказывает, что ключ-кандидат ACD имеет значение с учетом отношения с атрибутами ABCD и функциональной зависимости A → B? Я знаю, что здесь есть что-то похожее: оператор SQL, чтобы доказать, что A-›B в R(ABCD), но не могу понять, как написать запрос для этого ограничения.


person User1998    schedule 27.01.2019    source источник
comment
Кажется, вы имеете в виду, что если {A → B} является покрытием, то ACD является CK.   -  person philipxy    schedule 04.03.2019


Ответы (1)


\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.

Кстати: ИМО невозможно доказать что-то в SQL (это зависит от текущих данных в таблице(ах)), но возможно отклонить это. (при составлении примера)

person wildplasser    schedule 27.01.2019