C# 如何将自定义ID列与表的主键列同步

C# 如何将自定义ID列与表的主键列同步,c#,mysql,sql-server,C#,Mysql,Sql Server,首先,很抱歉描述得太多。 我通过创建一个自定义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 Pa

首先,很抱歉描述得太多。 我通过创建一个自定义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    PatientID
 1      PID-1
 2      PID-2
 3      PID-3
 4      PID-4

现在,举例来说,当添加更多记录时,会抛出一个异常,尽管记录未保存,但ID会增加。问题来了。假设出现一些错误,ID 5的记录无法保存在数据库中,在修复该错误后,当程序正确运行时,它将ID 6而不是5。对于patientID,由于MAX query,它将PID-5设置为。从这里开始,两个ID都是不同的。删除的问题相同,如果我从上表中删除最后一条记录,即4和PID-4,则下一条记录的ID为5,而PatientID为PID-4。这就是从我这边处理两个ID的整个问题。非常感谢您对我的想法或比我更好的想法的任何替代解决方案或修改。

在SQL Server中,您可以为此创建一个计算列:

ALTER TABLE Patient DROP COLUMN PatientID;
GO
ALTER TABLE Patient ADD COLUMN PatientID AS ('PID-'+CAST(ID AS VARCHAR(15));
有关计算列的更多信息,请查看


注意:我假设您的表的名称是Patient。如果这不是表的名称,则必须相应地更改它。

在SQL Server中,您可以为此创建一个计算列:

ALTER TABLE Patient DROP COLUMN PatientID;
GO
ALTER TABLE Patient ADD COLUMN PatientID AS ('PID-'+CAST(ID AS VARCHAR(15));
有关计算列的更多信息,请查看



注意:我假设您的表的名称是Patient。如果这不是您的表名,您必须相应地更改它。

如果我像您建议的那样添加一个计算列,它会对我的C代码产生什么影响。我不必检查最大值?实际上,您只需要在select语句中读取该值。关于本专栏,您不必做任何其他事情。每次在表上运行select语句时,如果您没有选择作为持久化计算列,则会计算该值。如果我没记错的话,有两种计算列—持久化列和动态计算列,当数据库引擎执行select语句时。为了回答您的问题,您必须删除与此列相关的任何内容,但相应属性除外。我假设您有一个表示病历的类,在这个类中,您有一个名为PatientID的属性,我指的是这个property.super duper解决方案。问题已解决..:D非常感谢你much@SidraM不客气,伙计!我很高兴我帮了忙:如果我像你建议的那样添加一个计算列,它会对我的C代码产生什么影响。我不必检查最大值?实际上,您只需要在select语句中读取该值。关于本专栏,您不必做任何其他事情。每次在表上运行select语句时,如果您没有选择作为持久化计算列,则会计算该值。如果我没记错的话,有两种计算列—持久化列和动态计算列,当数据库引擎执行select语句时。为了回答您的问题,您必须删除与此列相关的任何内容,但相应属性除外。我假设您有一个表示病历的类,在这个类中,您有一个名为PatientID的属性,我指的是这个property.super duper解决方案。问题已解决..:D非常感谢你much@SidraM不客气,伙计!我很高兴我帮了忙:对不起,如果这听起来太关键了,那么这个病人有什么意义呢?为什么您希望有一个额外的冗余代理项id,而只有一个效率低得多的代理项id通过附加一个无用的前缀存储为字符?@SidraM:显示4或PID-4只是字符串格式的问题。我不会[使用两列]同时存储这两个值。@SqlZim。。这是因为每个病人都有自己分配的id来核对记录。就像在学校里一样,学生们被分配了卷号等。。问题解决了。提出了解决办法by@ChristosSorry如果这听起来太关键了,那么这个病人有什么意义呢?为什么您希望有一个额外的冗余代理项id,而只有一个效率低得多的代理项id通过附加一个无用的前缀存储为字符?@SidraM:显示4或PID-4只是字符串格式的问题。我不会[使用两列]同时存储这两个值。@SqlZim。。这是因为每个病人都有自己分配的id来核对记录。就像在学校里一样,学生们被分配了卷号等。。问题解决了。提出了解决办法by@Christos