【问题标题】:sql integrity 1-1 or 1-0sql 完整性 1-1 或 1-0
【发布时间】:2019-01-08 06:22:42
【问题描述】:

我在考试中有一个问题,我不知道如何解决。

这是个问题:

如何保持 2 个表之间 1-1 或 1-0 关系的完整性?

现在主键和外键不起作用,因为这样你就可以建立 1 米的关系。也许您可以以某种方式使用唯一键或替代键?

我们需要给出创建表表达式并解释为什么会这样。

【问题讨论】:

  • “1-0”关系是什么意思? 1-1可以在Oracle和PostgreSQL中完成。
  • 我看了那个帖子,似乎没有标记为已解决。我也认为不清楚那篇文章的答案是什么。
  • 您提到的“1-m”关系可以通过在外表中添加唯一约束来简化为“1-1”。看我的回答。

标签: sql


【解决方案1】:

这是 PostgreSQL 中 1-1 关系的示例。它需要可延迟约束的标准 SQL 特性:

create table employee (
  id int primary key not null,
  name varchar(20),
  desk_id int not null,

  constraint uq1 unique (desk_id),
  constraint fk1 foreign key (desk_id) references desk (id)
    deferrable initially immediate
);

create table desk (
  id int primary key not null,
  desk_code varchar(20).
  employee_id int not null,

  constraint uq2 unique (employee_id),
  constraint fk2 foreign key (employee_id) references employee (id)
    deferrable initially immediate
);

用简单的英语:employee 的每一行都指向一个desk。每个desk 指向一个employee

据我所知,可延迟约束仅在 PostgreSQL 和 Oracle 中实现。

【讨论】:

    【解决方案2】:

    我将举一个来自 oracle 的例子

    这里是 1:1 关系示例

    create table state
    (
        sid number(3) ,
        name varchar2(100),
        gid number(3) not null,
        constraint state_pk primary key (sid),
        constraint gov_state_fk foreign key (gid) references gov(gid)
    );
    

    这里是 1:0..1 关系(又名超射)

    create table state
    (
        sid number(3) ,
        name varchar2(100),
        gid number(3) ,
        constraint state_pk primary key (sid),
        constraint gov_state_fk foreign key (gid) references gov(gid)
    );
    

    基本上不同的是,

    • 在 1:0 关系中,gid 可以为空
    • 在 1:0..1 关系中 gid 不能为空

    编辑:我还添加了 Unicity 以保持 1:0..1 和 1:1 的关系。

    【讨论】:

    • gov 表是什么样的?与状态表相同的设置?
    • 我认为 1:1 的例子可能是错误的。这些约束将允许gov 中的一行与state 中的任何行无关。
    • @Simonare 不要学究气什么的,但我仍然认为gov 表(未显示)需要有一个约束来确保1:1 的关系。
    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多