2017-04-14 73 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