【问题标题】:Remove foreign key and reference tables in SQL Server删除 SQL Server 中的外键和引用表
【发布时间】:2016-04-22 18:43:00
【问题描述】:

我有四张桌子StoreEmployeeCustomerAddress。我已将前三个表链接到Address。现在我想删除这个FK 并将这些表引用到Address。我该怎么做?

表结构:

商店

    StoreID(PK), BranchName

员工

    EmpID(PK), Name

客户

    CustID(PK), Name

地址

    AddID(PK), 
    ID(FK to Store.StoreID, Employee.EmpID, Customer.CustID), 
    AddressDetail

我想删除 Address.ID 上的 FK 并将其引用到三个表。

【问题讨论】:

  • stackoverflow.com/a/190306/119477 你有三个选择。我喜欢 TPC 但看起来你想要 TPT,这意味着你需要另一张桌子
  • 我想知道为什么有人决定做那个设计!

标签: sql-server sql-server-2008 management-studio-express


【解决方案1】:

您可以使用 ALTER TABLE 语句删除 FOREIGN KEY 约束。例如

ALTER TABLE [Address] DROP CONSTRAINT [FK_Address_Store]

要删除一列,再次使用 ALTER TABLE 语句。

ALTER TABLE [Address] DROP COLUMN [ID]

您尝试实现的数据模型根本不清楚。一个客户可以关联多少个地址?只有一个,还是不止一个?同一个地址可以与客户和员工相关联吗?一个特定的地址可以与多个客户相关吗?

在我的实体关系模型中,“地址”通常是复合属性,而不是实体。通常,地址是一个多值属性(例如,客户可以有多个地址或多个电话号码)。有时,地址将是特定类型的地址(送货地址、帐单地址、办公地址、家庭住址),就像电话号码可以是一种类型(主要、手机、办公室、传真等)

在不了解数据模型的情况下,不可能就应该对数据库表进行更改以实现模型向您提供建议。

【讨论】:

  • 如果每条记录只有一个地址,我应该在所有表中添加地址列吗?
  • 或者,在 Employee 中添加一个外键列,[Addresss_AddID],其数据类型(int?)与 Address 表中的 AddID 列相同。并定义一个约束 [FK_Emplouyee_Address] 外键 [Address_AddID] 引用 [Address]([AddID])。您可以为 [Customer] 和 [Store] 添加外键列和外键约束重复相同的模式。
  • 这意味着我将Employee 更改为EmpID(PK), AddID(FK Address.AddID),...?而对于其他人。
  • 我会这样做,但是您使用的符号很奇怪。我们遵循的模式,对于外键列,我们将它们命名为引用表和表的主键。例如,在我的 [employee] 表中,我将添加一个名为 [address_id] 的列。 (但那是因为在我的 [address] 表中,主键名称将是 [id]。我会使用引用表和被引用表的名称来命名外键约束...... [FK_employee_address]。这只是我们在商店中遵循的约定。您的商店可能遵循不同的命名约定。
  • 但同样,我们实现的列和外键约束取决于实体关系数据模型,出于性能原因可能会进行一些非规范化调整。如果我只需要一个地址,并且该地址仅与一个客户相关,我们不会将其存储在单独的表中。我们将“地址”实现为 Customer 表中的复合属性。 (即,将列添加到名为 addr_line1、addr_line2、addr_city、addr_state、addr_postal_code 等的 Customer 表中。我们只是将这些单独的列视为组合在一起,形成一个名为“addr”的属性。)
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2018-09-08
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多