首页 > 解决方案 > 删除主键但保留外键?

问题描述

在有人说这是一个重复的问题和否决票之前:我知道如何解决这个问题,但我想知道哪种方法是最好的解决方法。

我制作了一个预订系统,员工可以在其中创建预订。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]

如果有办法不做任何这些事情,那就太好了,因为即使员工已被移除,我也希望时钟号码保持不变,这样我们就可以看到谁进行了预订,即使他们不再为我们工作

标签: sql-server

解决方案


最好的方法是在 Employee 表中有一个标志作为isDeleted并使用该标志来维护已删除的员工。这样您也将拥有已删除员工的所有订单的记录


推荐阅读