Sql 如何反转错误建模的1:1关系?

Sql 如何反转错误建模的1:1关系?,sql,Sql,两个表之间的1:1关系模型不正确: Table: Customer * id (bigint) * ... Table: Address * id * customer_id (bigint) <--- FOREIGN KEY * street (varchar) * ... 是否可以使用纯SQL代码在一个事务中进行此迁移?我希望避免一种中间状态,即我们既有关系,又一个接一个地迁移客户。到目前为止,这是我想到的最好的主意。到目前为止,我理解的是您希望在customer表中添

两个表之间的1:1关系模型不正确:

Table: Customer
* id (bigint)
* ...

Table: Address
* id
* customer_id (bigint)       <--- FOREIGN KEY
* street (varchar)
* ...

是否可以使用纯SQL代码在一个事务中进行此迁移?我希望避免一种中间状态,即我们既有关系,又一个接一个地迁移客户。到目前为止,这是我想到的最好的主意。

到目前为止,我理解的是您希望在customer表中添加address\u id列。如果一个客户有多个地址,那么您可能只需要选择一个地址。我在考虑最后的地址

update Customer
set address_id=(select max(id) from Address a where a.customer_id=Customer.id)

实际上,您可以保持数据模型不变,只需向
地址添加一个唯一约束即可:

alter table address unq_address_customer unique (customer_id);
这并不理想,但它确实通过对数据模型的最小更改来实施唯一约束

也就是说,我会问为什么每个客户只需要一个地址。你考虑过这些情况吗

  • “交货”地址和“账单”地址不同的客户
  • 搬家的顾客
  • 由于邮政编码的重新分配或街道名称的改变,虽然他们不移动,但地址发生变化的客户

您使用的是哪种DBMS产品?“SQL”只是所有关系数据库使用的查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加。为什么不简单地在地址表中的customer_id上添加唯一索引呢?通常多个客户可以共享同一地址。您确定应该在数据库中使用1:1关系建模吗?您使用的是哪种数据库管理系统?谢谢您的建议。目前的情况是,每个客户肯定只需要一个当前地址(地址更改将创建一个新的“客户”;我简化了问题)。我会考虑约束,但首先要检查其他建议。您可能需要一个带有版本生效日期和结束日期的type-2表,这是回答问题的另一种方式。为了得到一个有用的解决方案,你可能把问题简化了。是的,它被简化了。表“Customer”实际上是一个包含有效性信息的Customer修订版。当任何客户信息(包括地址)发生更改时,我们将创建一个新行。这就是为什么1:1的关系足够好的原因。
alter table address unq_address_customer unique (customer_id);