如何在 SQL 中实现 ER 图中显示的客户和帐户表。
- 每个客户都有 1 个帐户。
- 每个帐户仅属于 1 个客户。
- 在删除客户时,也应删除关联的帐户行
有了这种关系,您几乎不需要两个表。它们之间存在 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
. 这将真正解决您的问题。所有的列都可以放在一张表中,两个“实体”的删除和插入会自动同步。