MySQL在删除级联,FK在源表中

  • 本文关键字:FK 删除 级联 MySQL mysql
  • 更新时间 :
  • 英文 :


我有两个表,客户和地址。客户具有FK引用到表地址的列地址。

表客户

create table customer
(
id int(11) not null primary key,
...
address    int(11) null,
constraint fk_customer_address
foreign key (address) references address (id)
on update cascade on delete cascade,
)

表地址

create table address
(
id int(11) not null primary key,
...
)

我希望在客户表中有地址id,因为将来会有更多的表引用地址表(Users.address、Business.address等(,并且由于格式相同,所有地址都有一个表。

当我删除客户表中的行时,地址行将保留在数据库中。

是否可以使用此FK关系删除地址表中的行,或者必须手动(以编程方式(删除它?

这是否意味着当我从地址中删除行时,客户行也会被删除?

编辑:
是的。

删除地址行时,您可能不希望删除客户行。我认为如果fk被定义为";关于删除限制";或";在删除集为null时";。

这样,如果你想删除地址记录:

  • on delete set null➞对该地址的所有引用都将设置为null
  • on delete restrict➞您应该手动将所有子表上的address_id更新为其他值(或null(,然后删除父行

您可以通过定义相反的fk来避免程序删除(即:地址表有一个客户表的外键,以及其他(

然而,对我来说,这感觉有点不自然,因为您必须在地址表上为要引用的每个其他表添加一个新列。每个表都有地址的fk,这感觉更自然。

另一个缺点是,它不允许在同一个表上重用相同的地址。例如,如果两个客户共享同一地址,则需要为每个客户创建一行。

对于第一个解决方案,您只需要地址表上的一行,不同的客户可以在客户表上多次引用该行。

当然,您的要求可能是1:1的关系。但请记住,需求可能会发生变化:(。如果他们这样做了,并且您以后需要在不同的行之间共享相同的地址,那么您就可以使用第一个解决方案了。

我会用你最初的方法;在删除集为null时";限制

最新更新