0

如何在 SQL 中实现 ER 图中显示的客户和帐户表。

  1. 每个客户都有 1 个帐户。
  2. 每个帐户仅属于 1 个客户。
  3. 在删除客户时,也应删除关联的帐户行

在此处输入图像描述

4

1 回答 1

0

有了这种关系,您几乎不需要两个表。它们之间存在 1-1 关系,即使在删除时也是如此。这几乎可以说它们是同一件事。通常,客户将被允许拥有两个帐户。或者,客户可能在没有活动帐户的情况下存在。

一种方法是使用自反外键关系:

create table customers as (
    customerId identity(1, 1) primary key,
    accountId int not null,
    . . .
);

create table accounts as (
    accountId identity(1, 1) primary key
    customerId int not null references customers(customerId)
    . . .
);

alter table customers add foreign key (accountId) references accounts(accountId) on delete cascade;

(我只是identity()为了方便起见。)

但是,您会发现插入和删除行确实很棘手,因为两个表中的引用必须同步。您可以使用事务或触发器来解决此问题,或者在某些情况下使用可更新视图。

另一种方法是让一个表更“占主导地位”并在它们之间共享主键:

create table customers as (
    customerId identity(1, 1) primary key,
    accountId int not null,
    . . .
);

create table accounts as (
    customerId int primary key references customers(customerId)
    . . .
);

这并没有完全完成这种关系。这并不能保证所有客户都有匹配的帐户。如果您尝试恢复这种关系,那么您将遇到数据修改问题。

最后,您可以只创建一个表,CustomerAccounts. 这将真正解决您的问题。所有的列都可以放在一张表中,两个“实体”的删除和插入会自动同步。

于 2018-05-13T17:33:45.413 回答