如何使用c#在SQL Server的表上删除记录为false?

时间:2015-11-20 10:00:22

标签: c# sql-server

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

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

  

"记录已成功删除"

此消息将显示给用户。

在我的删除程序中,我写了update语句,以使isActive设置为false:

update wardtable 
set isActive = false 
where wardid = @wardid

到此为止。如果用户想要使用已删除的wardid输入详细信息,那么当他尝试输入已删除wardid的数据时,前端存在主键违规消息问题。< / p>

如何解决这个问题?

假设我在ward table中使用了另一个ID,那么如果我将id设为autoincrement,则允许。但如果我愿意,可以在我的wardid's中复制ward table

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

2 个答案:

答案 0 :(得分:1)

你用你的主键做得太多了。

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

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

答案 1 :(得分:0)

要添加uk2k05's answer一个如何实现它的例子

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'

您需要做的另一项逻辑更改,链接到此表的任何forgen键应使用wardTableId而不是wardid进行链接