如何使用c#在SQL Server中的表中将已删除的记录设为false

本文关键字:删除 记录 false SQL Server 何使用 | 更新日期: 2023-09-27 18:23:40

我有一个ward table,它包含wardid, wmemname, isActive,等列…wardid是主键,isActive是布尔值。

如果用户从前端删除记录,我将isActive设置为false。

"记录删除成功"

此消息将显示给用户。

在我的删除过程中,我编写了一个update语句,使isActive设置为false:

update wardtable 
set isActive = false 
where wardid = @wardid

好的,到这里。如果用户想用已删除的wardid输入详细信息,那么当他试图用已删除wardid输入数据时,来自前端的主键违规消息会出现问题。

如何解决这个问题?

假设我在ward table中取另一个id,那么如果我将id设为autoincrement,这是允许的。但如果我喜欢的话,我的ward table中允许重复的wardid's

那么,最好的方法是什么呢?

如何使用c#在SQL Server中的表中将已删除的记录设为false

你用主键做得太多了。

创建uniqueidentifier/long类型的真正主键,并在需要时自动生成。

Wardid不应该是此表的主键,请使用您的业务逻辑查找此列上的数据,并根据需要更新/删除/插入。将新主键保留为仅供数据库使用。如果wardid需要是唯一的,那么通过将其添加到唯一索引或使用业务逻辑,使其成为唯一列。

在uk2k05的答案中添加一个如何实现的示例

CREATE TABLE dbo.wardtable
    (
    wardTableId bigint NOT NULL IDENTITY (1, 1),
    wardid int NOT NULL,
    deletedUniqueifier uniqueidentifier NOT NULL default('00000000-0000-0000-0000-000000000000'),
    wmemname varchar(50) NOT NULL,
    isActive AS (case when deletedUniqueifier = '00000000-0000-0000-0000-000000000000' then 1 else 0 end) PERSISTED
    )
ALTER TABLE dbo.wardtable ADD CONSTRAINT
    PK_wardtable  PRIMARY KEY CLUSTERED (wardTableId)
CREATE UNIQUE NONCLUSTERED INDEX UX_wardtable_wardid 
    ON dbo.wardtable (wardid, deletedUniqueifier)

现在isActive是一个计算列,您的更新也必须更改为

update wardtable 
set deletedUniqueifier = newid() 
where wardid = @wardid and deletedUniqueifier = '00000000-0000-0000-0000-000000000000'

您需要做的另一个逻辑更改是,链接到此表的任何伪造密钥都应该使用wardTableId而不是wardid 进行链接