sql-server - 删除主键但保留外键?
问题描述
在有人说这是一个重复的问题和否决票之前:我知道如何解决这个问题,但我想知道哪种方法是最好的解决方法。
我制作了一个预订系统,员工可以在其中创建预订。employees 表有一个他们的时钟号的主键,这是 bookings 表中的一个外键,因为除非他们是管理员,否则员工只能删除他们自己的预订。
现在,当我想删除员工时出现问题,但他们在系统中进行了 1 个或多个预订,显然,当我删除“父母”时,“孩子”也希望被删除,但我需要保留整个预订历史。
我的解决方案是删除预订表中的外键约束,因此仍然有一个时钟号但没有外键。或者使用 ON CASCADE NULL 功能进行设置?
CREATE TABLE [dbo].[Employees](
[ClockNo] [int] NOT NULL,
[Forename] [varchar](20) NOT NULL,
[Surname] [varchar](20) NOT NULL,
[Email] [varchar](50) NOT NULL,
[Department] [varchar](50) NOT NULL,
[IsAdmin] [bit] NOT NULL,
[Password] [varchar](max) NOT NULL,
CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED
(
[ClockNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[Bookings](
[InvoiceNo] [varchar](40) NOT NULL,
[ClockNo] [int] NOT NULL,
[GateNo] [smallint] NOT NULL,
[TruckNo] [smallint] NOT NULL,
[StartTime] [datetime] NOT NULL,
[EndTime] [datetime] NOT NULL,
[Status] [varchar](20) NOT NULL,
[Seal] [varchar](40) NULL,
[ContainerNo] [varchar](40) NULL,
CONSTRAINT [PK_Bookings] PRIMARY KEY CLUSTERED
(
[InvoiceNo] ASC,
[GateNo] ASC,
[StartTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
如果有办法不做任何这些事情,那就太好了,因为即使员工已被移除,我也希望时钟号码保持不变,这样我们就可以看到谁进行了预订,即使他们不再为我们工作
解决方案
最好的方法是在 Employee 表中有一个标志作为isDeleted
并使用该标志来维护已删除的员工。这样您也将拥有已删除员工的所有订单的记录
推荐阅读
- python-3.x - 将训练和测试数据集写入单独的文件
- mysql - 有没有办法可以创建这样的歌曲请求,以及如何制作注册和登录资料?
- jquery - 如何在 3 秒后停止加载程序的动画
- ansible - 使用 Terraform 时 Ansible 如何找到 group_vars
- python - 收到确认后添加角色
- angular - 我可以在 ag-grid 中使用内部超链接吗?
- python - 如何在 AWS EMR 中一起添加 2 个(pyspark、scala)步骤?
- javascript - Kotlin/JS NPE 源代码参考
- r - 动态数据框中从字符到日期的列名
- python - 如何将末尾带有 UTC-# 的字符串转换为 Python 中的 DateTimeField?