2017-04-14 78 views
1

我在SQL Server中有一个数据库,我有一张表给客户,每个客户可以有多个预订,但预订只能属于一个客户。关键是我已经编写了一个API,然后使用WPF编写了一个客户端应用程序,但是我只注意到,如果没有实际删除与该客户相关的预订,我无法删除一个客户。我的T-SQL看起来像这样大致是:删除没有CASCADE DELETE的行?

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [FullName] [nvarchar](50) NOT NULL, 
    [DateOfBirth] [date] NOT NULL, 
    [Phone] [nvarchar](20) NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)) 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Booking](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Amount] [decimal](10,2) NOT NULL, 
    [CustomerId] [int] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)) 

ALTER TABLE [dbo].Booking WITH CHECK ADD CONSTRAINT [FK_Booking_Customer] FOREIGN KEY([CustomerId]) 
REFERENCES [dbo].[Customer] ([Id]) 
GO 
ALTER TABLE [dbo].[Booking] CHECK CONSTRAINT [FK_Booking_Customer] 
GO 

然后,我有这样的定义删除存储过程:

CREATE PROCEDURE DeleteCustomer 
    @Id int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DELETE FROM [dbo].[Customer] 
    WHERE Id = @Id 
END 
GO 

但正如我所说,我不能删除已存在的预订客户。一种方法肯定是使用CASCADE DELETE,但如果客户被删除,我不希望删除预订。任何想法如何克服这个问题或任何解决方法?

+0

摆脱外键或通过一些自定义标记删除客户(这也可以让您在需要时取消删除)。 – Marvin

+0

@Marvin是否有可能以某种方式摆脱外键,做删除,然后返回外键? – typos

回答

1

我看到的选项:

  1. 使外键列[CustomerId]为空,然后用on delete set null
  2. 使用上Customer表,例如软删除位列如IsActiveIsDeleted
  3. 禁用外键:alter table [dbo].Booking nocheck constraint [FK_Booking_Customer]
  4. 删除外键。

在大多数情况下,我会执行软删除选项。

+0

感谢您的选择。第一个在我的场景中工作正常。 – typos

+0

@typos乐意帮忙! – SqlZim