Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 删除主键但保留外键?_Sql Server - Fatal编程技术网

Sql server 删除主键但保留外键?

Sql server 删除主键但保留外键?,sql-server,Sql Server,在任何人说这是一个重复的问题和否决票之前:我知道如何解决这个问题,但我想知道哪种方法是最好的 我制作了一个预订系统,员工可以在其中创建预订。employees表的主键是其时钟号码,这是bookings表中的外键,因为员工只能删除自己的预订,除非他们是管理员 现在,当我想删除一名员工,但他们在系统中进行了一次或多次预订时,就会出现问题。显然,当我删除“父”时,“子”也会被删除,但我需要保留整个预订历史记录 我的解决方案是删除bookings表中的外键约束,因此仍然有一个时钟编号,但没有外键。或者设

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

我制作了一个预订系统,员工可以在其中创建预订。employees表的主键是其时钟号码,这是bookings表中的外键,因为员工只能删除自己的预订,除非他们是管理员

现在,当我想删除一名员工,但他们在系统中进行了一次或多次预订时,就会出现问题。显然,当我删除“父”时,“子”也会被删除,但我需要保留整个预订历史记录

我的解决方案是删除bookings表中的外键约束,因此仍然有一个时钟编号,但没有外键。或者设置一些关于级联空特性的东西

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
,并使用该标记来维护已删除的员工。这样,您也将拥有已删除员工的所有订单的记录

最佳方法是在员工表中设置一个标记为
isDeleted
,并使用该标记来维护已删除的员工。这样你就可以记录所有被删除员工的订单了

问“最好的方式是什么”也是离题的;因为它会产生固执己见的答案。不过,这听起来不应该删除行,而应该将员工标记为不再受雇。如果要删除被另一个表作为外键引用的行,也需要删除这些其他行。不这样做会使外键变得毫无意义,并破坏您拥有的任何(和所有)引用完整性;我真的希望不是。您应该使用has和salt来存储密码。在另一个表中存在对该员工的引用时删除该员工会使您的数据库损坏。你应该给你的员工添加一个日期字段,你可以将他标记为从该日期起不再在这里工作,而不是删除,除非这个员工没有在任何其他表中使用,否则你仍然可以将他删除。我将创建一个“失业”列,这样他们就不会被删除,而是被归类为失业。我对密码使用哈希算法。谢谢。问“最好的方法是什么”也不是话题;因为它会产生固执己见的答案。不过,这听起来不应该删除行,而应该将员工标记为不再受雇。如果要删除被另一个表作为外键引用的行,也需要删除这些其他行。不这样做会使外键变得毫无意义,并破坏您拥有的任何(和所有)引用完整性;我真的希望不是。您应该使用has和salt来存储密码。在另一个表中存在对该员工的引用时删除该员工会使您的数据库损坏。你应该给你的员工添加一个日期字段,你可以将他标记为从该日期起不再在这里工作,而不是删除,除非这个员工没有在任何其他表中使用,否则你仍然可以将他删除。我将创建一个“失业”列,这样他们就不会被删除,而是被归类为失业。我对密码使用哈希算法。谢谢