2017-06-04 97 views
0

主要是,抱歉太过于描述。 我通过创建一个自定义ID字段“PatientID”来存储患者的信息在sql db中,并且我有一个主键字段“ID”。 PatientID有一个模式“PID-1”或“PID-2”等等。我想同步两个ID。如果表格的“John”的ID是4,那么其patientID也应该是“PID-4”。为此,我做了一些编码,比如没有记录,然后从“PID-1”开始保存patientID,然后为所有下一个记录首先从ID字段中找到患者的最大ID,并将其增加1并将其与“PID “+(tableID + 1)。如何同步自定义ID列与表的主键列

ID PatientID 
1  PID-1 
2  PID-2 
3  PID-3 
4  PID-4 

现在,对于一个实例,在添加更多记录时,虽然记录未保存,但ID增加,但引发异常。问题来了。假设有一些错误,ID 5的记录无法保存在数据库中,在程序正确运行时修复了这个错误后,它将ID 6而不是5.并且对于patientID,由于MAX查询,它将放入“PID-5” 。从这里开始,两个ID都不同。删除同样的问题,如果我删除上表中的最后一条记录,即4和PID-4,则下一个记录的ID将是5,而PatientID将是“PID-4”。这是处理我身边两个ID的整个问题图片。任何替代解决方案或任何修改我的想法或任何更好的主意,那么我将高度赞赏。

+1

很抱歉,如果这听起来太关键了,但是这个“PatientId”有什么意义?为什么你想要一个额外的冗余代理ID,只有一个效率较低的存储为字符的附加无用的前缀? – SqlZim

+0

@SidraM:显示4或PID-4只是字符串格式化的问题。我不会存储这两个值[使用两列]。 –

+0

@SqlZim ..那是因为每个病人都有自己的ID来检查记录。就像在学校的学生分配辊编号等 – SidraM

回答

2

在SQL Server中,你可以为这个目的创建一个计算列:

ALTER TABLE Patient DROP COLUMN PatientID; 
GO 
ALTER TABLE Patient ADD COLUMN PatientID AS ('PID-'+CAST(ID AS VARCHAR(15)); 

有关计算列的详细信息,请看看here

注意:我认为你的表名是Patient。如果这不是你的表的名字,你必须相应地改变它。

+0

如果我添加一个像您一样的计算列,它会对我的C#代码产生什么影响。那么我不必检查最大值? – SidraM

+0

其实你只会在select语句中读取这个值。您无需为此专栏做任何其他事情。每次在表上运行select语句时,如果您没有选择保留计算列,则会计算该值。如果我没有记错的话,有两种计算列是持久化的,以及那些在数据库引擎执行select语句时即时计算的。 – Christos

+0

因此,要回答你的问题,你必须删除任何与此列相关的东西,除了相应的属性(我想你有一个类代表一个Patient记录,在这个类中你有一个名为PatientID的属性,我指的是这个属性。 ) – Christos