【发布时间】:2013-10-15 23:58:39
【问题描述】:
我有以下问题要解决,我认为我需要一些帮助,因为我认为我认为的可能解决方案不正确:
我有一个带有 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 来获取新的PatientId 以分配给新记录,但这将是并发问题。如果多个用户同时创建一个新患者,SP 基本上会为他们两个计算相同的PatientId,然后我会在表中使用相同的PatientId 结束两个不同的患者。
然后,我正在考虑将更新放入 SQL Server 事务中以阻止表,但我认为这太过分了。此外,对于复杂的更新,我认为该表会被阻塞太久,并且其他创建患者的尝试会超时。有没有更好的方法来实现这一点?
谢谢。
【问题讨论】:
-
lelewin,能详细点吗?
-
在 SQL Server 2012 中,您的
PatientId可以有一个SEQUENCE(它就像一个标识列,但不绑定到一个表)
标签: sql sql-server stored-procedures identity-column