如何解决或绕过违反PRIMARY KEY约束

时间:2013-03-19 07:05:29

标签: sql-server

我正在研究通过SQL Server 2012的c#程序。我想建立患者状态变化的历史记录。也就是说,每当患者取消/更换任何医疗保健提供者时,都必须更新。

我希望使用患者编号的主键保留这些更改的历史记录。 因此,我的问题是:我有什么方法可以修复或解决违反PK的问题吗?

  

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

3 个答案:

答案 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(日期时间)和UpdatedBy,(用户ID)

答案 1 :(得分:0)

只有一条带有某个主键的记录。要修复,可以通过向主键添加更多列来松开约束或扩大约束。

患者编号上带有主键的历史记录听起来像无效的数据库设计。历史记录日志实际上不具有主键,因为您找不到一个唯一的列或组合。在患者编号或插入日期上使用普通键。

答案 2 :(得分:0)

听起来你要做的就是拥有状态变化的审计表。我建议通过设计,因为一个人可以进行多项更改,而不是让他们的患者编号成为本审核表中的主要密钥..

您可以考虑将主键作为标识列使用单独的审计表(尽管您可能希望保留并关注极端情况下的记录增长/数量)或UNIQUEIDENTIFIER列,因此主键是GUID

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

HTH, 森