2013-03-19 40 views
0

我正在研究通过SQL Server 2012的c#程序。我想构建患者状态更改的历史记录。每次患者取消/更改任何医疗保健提供者时,都必须更新。如何解决或解决冲突PRIMARY KEY约束

我想通过患者编号的主键保留这些更改的历史记录。 因此,我的问题是:有没有什么办法可以解决或解决PK的违规问题?

违反PRIMARY KEY约束'PK_patient_member_status'。 不能在对象 'dbo.member_patient_member_status_history'中插入重复键。

+0

为什么你不能用'update',而不是'insert'? – 2013-03-19 07:08:02

+0

我想保留过去的医疗保健提供者的所有历史记录等 – user2164182 2013-03-19 07:09:18

+0

然后使用另一张表来保存@Habib建议的详细信息 – 2013-03-19 07:10:39

回答

0

一个主键只能有一条记录。要解决这个问题,可以通过向主键添加更多列来释放约束或扩大约束。

患者编号的主键历史记录听起来像无效的数据库设计。历史日志不能真正拥有主键,因为您无法找到一个必须唯一的列或组合。在患者编号或插入日期使用正常的密钥。

2

您不能输入重复的主键代替为患者历史创建一个新表,其中外键为Paients的键。该表将有1:M(一对多关系)。您将能够输入多个历史记录或跟踪特定记录的变化。

That table will keep the changed fields for example: 

Patient Table: 

ID  NAME   Address 
1  ABC    XYZ 
2  DEF    PQR 


Patient History 
ID  NAME   ADDRESS  FKPatientID 
1  ABC   XYZ1   1 
2  ABC2   YXZ2   1 

在上述历史记录表中,它跟踪对主表的更改。您还可以保留UpdatedAt(DateTime)和UpdatedBy(用户ID)

0

的记录这听起来像你想要做的是有状态更改审计表。我建议通过设计,因为一个人可以进行多项更改,但不会将其患者编号作为此审核表中的主键。

您可能会考虑将具有主键的单独审核表作为标识列尽管您可能希望在极端情况下保持并关注记录的增长/数量)或UNIQUEIDENTIFIER列,以便主键是GUID。

由于通过查询获取特定患者的状态更改很重要,因此您可能需要考虑在审核/状态更改表中针对患者编号定义index

HTH, 弥敦道