如何使用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
。
那么,最好的方法是什么呢?
你用主键做得太多了。
创建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
进行链接