database - Postgresql 中的约束

标签 database postgresql foreign-keys constraints

所以,我要解决这个练习。我有一个数据库,我需要添加一个约束。我不知道我是否解决了这个问题,因为我是新手,我正在尝试自学,但在搜索之后我得出结论,这可能是通过使用外键约束。

这些是我数据库中这个问题的相关表格:

MusicGroup(idG, name, city, country, year)

Edition(idG, titleE, year, editor)
idG : FK(MusicGroup)

Music(idG, titleM, length)
idG : FK(MusicGroup)

Album(idG, titleE)
idG, titleE : FK(Edition)

Track(idG, titleE, number, titleM)
idG, titleE : FK(Album)
idG, titleM : FK(Music)

Single(idG, titleE, titleM)
idG, titleE : FK(Edition)
idG, titleM : FK(Music)

这里是创建数据库的说明(也是我做的):

create table MusicGroup (idG char(10) not null
    unique(idG),
    name varchar(255) not null,
    city varchar(255) not null,
    country varchar(255) not null,
    year numeric(6,0) not null,
    primary key (idG))


create table Edition (idG char(10) not null,
    titleE varchar(50) not null,
    year numeric(6,0) not null,
    editor varchar(255) not null,
    primary key (idG, titleE),
    foreign key(idG) references MusicGroup(idG))


create table Music (idG char(10) not null,
    titleM varchar(50) not null
    unique(titleM),
    length float(1) not null,
    primary key (idG, titleM),
    foreign key(idG) references MusicGroup(idG))


create table Album (idG char(10) not null,
    titleE varchar(50) not null,
    primary key (idG, titleE),
    foreign key(idG, titleE) references Edition(idG, titleE))


create table Track (idG char(10) not null,
    titleE varchar(50) not null,
    number smallint not null,
    titleM varchar(50) not null,
    primary key (idG, titleE, number),
    foreign key(idG, titleE) references Album(idG, titleE),
    foreign key(idG, titleM) references Music(idG, titleM))


create table Single (idG char(10) not null,
    titleE varchar(50) not null,
    titleM varchar(50) not null,
    primary key (idG, titleE),
    foreign key(idG, titleE) references Edition(idG, titleE),
    foreign key(idG, titleM) references Music(idG, titleM))

我必须添加以下限制条件:专辑的标题必须是该专辑中其中一首轨道的标题,并且该轨道必须已经作为单曲发布。

所以我尝试这样解决:

alter table Album
add foreign key (idG, titleE, titleE) references Track(idG, titleE, titleM)

alter table Track
add foreign key (idG, titleE, titleM) references Single(idG, titleE, titleM)

我不得不说第一个外键似乎不太好,但正如我所说,我是新手。

非常感谢您的帮助:)

最佳答案

对于这组表定义,SQL FK 不是可行的方法。您需要的 FK 的目标是 Track 和 Single 之间的 JOIN(以表达专辑名称必须被称为该专辑上的轨道并且必须被称为单曲的概念)。

除了降低设计的 NF 级别并引入冗余之外,在 SQL 中没有办法做到这一点(即便如此,我也不确定在这种特殊情况下它是否足够)。

你说这是一本书的练习。那本书也包括 CHECK 约束吗?如果是这样,练习的目的可能是让您编写适当的检查约束。如果不是,我真的无法想象作者的想法是什么样的解决方案。

请注意,虽然 SQL 标准允许您在 CHECK 约束中编写几乎任何内容,但许多实现仅提供标准定义的完整“理论”功能的非常有限的子集。

关于database - Postgresql 中的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8111647/

相关文章:

database - Master + Slave 数据库架构 vs. Master + Memcache

内存不足时Android应用程序强制关闭

database - Django SAAS 项目

postgresql rails 4 问题与 record_changed?由 Active Record 定义

sql-server - sql :need to change constraint on rename table?

postgresql - 尴尬/错误的 PostgreSQL 外键定义

c# - 在 .Net Core 中播种

postgresql - 按 UUID 排序在 PostgreSQL 中如何工作?

php - 数据库查询信息到下拉菜单

MySQL:如何修改列以添加属性 "On Delete Cascade"?