我有一个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
。
那么,最好的方法是什么?
答案 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
进行链接