sql-server - 尝试在具有数据和现有数据操作的现有表中添加一个新列作为外键
问题描述
一个非常简单的例子。我在数据库中有一个带有表的 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 列时,我将此列设置为空值(正确吗?),但作为外键,我不想允许空值。我可以更改它还是如何处理它?
解决方案
1)现在我有 50 个没有部门 ID 的现有记录。但是,我必须手动添加这个值吗?最佳做法是什么?对于 50 条记录是可能的,但对于 2000 条或更多记录?
这取决于。您可以为“未分配”设置一个新部门并将它们全部分配给该部门;您可以向 HR 发送电子表格,说“以下员工没有指定部门;他们在哪个部门?ps;在发回之前不要从工作表中删除 EmployeeID 列;我需要更新数据库”。这在很大程度上是一个业务背景问题,而不是技术问题。X 千条记录很容易处理。如果您(或其他人)手动操作,只需花费一些时间即可完成。这些信息很可能在其他地方可用;您也许可以向所有部门负责人发送一份清单,说“这些人中的任何一个是您的吗?请删除所有您不知道的名字”然后根据您返回的内容更新数据库
由于这是一次性操作,因此您不需要任何特别高手的东西 - 您只需将 Excel 工作表取回并放在一个空列中:
="UPDATE emp SET departmentID = 5 WHERE id = " & A1
并填写它以生成一堆更新语句,将文本复制到您的查询工具中并点击 go;不需要花哨地将工作表加载到表格中,进行更新连接等 - 只需将 hacky 风格的东西放在 excel 中,它将为您编写 SQL,复制/粘贴/运行。如果 HR 发回了包含部门名称列表的工作表,则将部门名称和 id 放在工作表的其他位置,并使用VLOOKUP或 XLOOKUP将名称转换为部门编号,然后基于此编写 SQL
2)当我添加 departmentId 列时,我将此列设置为空值(正确吗?),但作为外键,我不想允许空值。我可以更改它还是如何处理它?
允许外键列具有 NULL 值 - 不是 FK 强加了“无 Nulls”限制,而是列的可空性(将列更改为departmantid INT NOT NULL
)强加了这一点。FK 引用一个主键,并且主键可能不为空(或者在某些数据库中,最多一条记录可以有一个 [部分] 空的 PK),但您可以让这些部门为空。如果您确实将列更改为不为空,则需要先更正 NULL 值,否则更改将失败
推荐阅读
- java - Paths.get 找不到文件 Windows 10 (java)
- ruby-on-rails - 无法使用 Ruby on Rails 在我的编辑部分填写价格字段
- android - 如何在 Firebase 中获取过去的数据条目?
- php - 如果 php 中的 while 循环条件为假,如何重置/更改变量值
- c# - 从另一种方法编辑 RichTextBox
- c# - 如果两个表列具有相同的值,asp.net 更改 gridview 单元格
- microsoft-teams - 如何从 Teams 组织商店中删除自定义应用程序?
- sql - 使用分区的 Oracle SQL 查询
- docker - 外部化 Kibana 数据(可视化/仪表板)等
- javascript - 在 jupyter/jupyterlab 笔记本中使用 javascript 库