我有以下问题要解决,我认为我需要一些帮助,因为我认为我认为可能的解决方案不正确:
我有一个带有identity
列的 SQL Server 表。该表将存储当前数据以及历史数据,如下所述:
让我们假设下表:
CREATE TABLE Patient (PatientKey int IDENTITY(1,1) NOT NULL, PatientId int, UpdateDate datetime NOT NULL, UpdateUser int NOT NULL, RecordStatus tinyint NOT NULL)
PatientKey
是主键,也是标识列。PatientId
是唯一标识患者(当前记录以及历史记录)。UpdateDate
是插入或更新患者的日期。UpdateUser
用于插入或更新患者的用户的密钥。RecordStatus
是表示一条记录的状态:0-历史,1-当前,2-已删除。
在上表中
PatientId + RecordStatus = 1
是唯一标识一个患者的当前记录。当插入新患者时,会
PatientKey
为记录分配一个新患者(这由 SQL Server 引擎自动完成),并且PatientId
还必须计算一个新患者并将其分配给记录。此外,RecordStatus
设置为 1。当现有患者被更新时,当前记录被更新为设置
RecordStatus
等于 0。然后,使用患者的修改数据插入新行。作为插入的一部分,PatientKey
会为记录生成一个新的,但不会PatientId
计算新的(即PatientId
不会改变)。此外,RecordStatus
设置为 1。删除患者时,当前记录将更新为设置
RecordStatus
为 2。
问题在于 的计算PatientId
。我正在考虑MAX(PatientId) + 1
在存储过程中使用 a 来获取PatientId
要分配给新记录的新记录,但这将是并发问题。如果多个用户同时创建一个新患者,则 SP 基本上会PatientId
为他们两个计算相同的值,然后我会在表中结束两个不同的患者相同的PatientId
.
然后,我正在考虑将更新放在 SQL Server 事务中以阻止表,但我认为这太过分了。此外,对于复杂的更新,我认为该表会被阻塞太久,并且其他创建患者的尝试会超时。有没有更好的方法来实现这一点?
谢谢。