首页 > 解决方案 > 尝试在具有数据和现有数据操作的现有表中添加一个新列作为外键

问题描述

一个非常简单的例子。我在数据库中有一个带有表的 Web API

Employees
---------
Id
---------
Name

例如,我有 50 条记录。

现在我必须实现一个功能来添加有关部门的额外信息。因为我有一对多的关系,所以新的数据库模式与部门 ID

Employees           Department
----------         -----------
Id                  Id
---------           -----------
Name                Name
--------- 
DepartmentId

为此,我运行查询(我使用 SQL 服务器)

alter table Employees add constraint fk_employees_departmentid
foreign key (DepartmentId) references Department(Id);

但现在我有一些问题要处理

1)现在我有 50 个没有部门 ID 的现有记录。但是,我必须手动添加这个值吗?最佳做法是什么?对于 50 条记录是可能的,但对于 2000 条或更多记录?

2)当我添加 departmentId 列时,我将此列设置为空值(正确吗?),但作为外键,我不想允许空值。我可以更改它还是如何处理它?

标签: sql-serverdatabaseapidatabase-designdatabase-schema

解决方案


1)现在我有 50 个没有部门 ID 的现有记录。但是,我必须手动添加这个值吗?最佳做法是什么?对于 50 条记录是可能的,但对于 2000 条或更多记录?

这取决于。您可以为“未分配”设置一个新部门并将它们全部分配给该部门;您可以向 HR 发送电子表格,说“以下员工没有指定部门;他们在哪个部门?ps;在发回之前不要从工作表中删除 EmployeeID 列;我需要更新数据库”。这在很大程度上是一个业务背景问题,而不是技术问题。X 千条记录很容易处理。如果您(或其他人)手动操作,只需花费一些时间即可完成。这些信息很可能在其他地方可用;您也许可以向所有部门负责人发送一份清单,说“这些人中的任何一个是您的吗?请删除所有您不知道的名字”然后根据您返回的内容更新数据库

由于这是一次性操作,因此您不需要任何特别高手的东西 - 您只需将 Excel 工作表取回并放在一个空列中:

="UPDATE emp SET departmentID = 5 WHERE id = " & A1

并填写它以生成一堆更新语句,将文本复制到您的查询工具中并点击 go;不需要花哨地将工作表加载到表格中,进行更新连接等 - 只需将 hacky 风格的东西放在 excel 中,它将为您编写 SQL,复制/粘贴/运行。如果 HR 发回了包含部门名称列表的工作表,则将部门名称和 id 放在工作表的其他位置,并使用VLOOKUPXLOOKUP将名称转换为部门编号,然后基于此编写 SQL

2)当我添加 departmentId 列时,我将此列设置为空值(正确吗?),但作为外键,我不想允许空值。我可以更改它还是如何处理它?

允许外键列具有 NULL 值 - 不是 FK 强加了“无 Nulls”限制,而是列的可空性(将列更改为departmantid INT NOT NULL)强加了这一点。FK 引用一个主键,并且主键可能不为空(或者在某些数据库中,最多一条记录可以有一个 [部分] 空的 PK),但您可以让这些部门为空。如果您确实将列更改为不为空,则需要先更正 NULL 值,否则更改将失败


推荐阅读