删除没有CASCADE DELETE的行?

时间:2017-04-14 16:32:48

标签: sql sql-server tsql

我在SQL Server中有一个数据库,我有一个供客户使用的表,每个客户可以有多个预订,但预订只能属于一个客户。关键是我已经使用WPF编写了一个API然后编写了一个客户端应用程序,但我只是注意到我没有删除客户而实际上没有删除与该客户相关的预订。我的T-SQL粗略地看起来像这样:

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,但如果客户被删除,我也不希望删除预订。知道如何克服这个问题或任何变通方法吗?

1 个答案:

答案 0 :(得分:1)

我看到的选项是:

  1. 使外键列[CustomerId]可以为空,然后使用on delete set null
  2. Customer表格上使用软删除,例如一个比特列,例如IsActiveIsDeleted
  3. 禁用外键:alter table [dbo].Booking nocheck constraint [FK_Booking_Customer]
  4. 删除外键。
  5. 在大多数情况下,我会实现软删除选项。