将主键从int移动到Guid
问题描述:
在我当前的项目中,我必须将多个客户端数据库同步到一个服务器数据库。我曾尝试过使用微软的同步框架,但对我而言并没有用。因此我必须手动进行同步。为此,我需要在所有表格中更改主键约束从int到guid。将主键从int移动到Guid
问题是这个主键在其他表中也被称为外键。 我下面简称,
Moving from ints to GUIDs as primary keys
我不擅长SQL。我理解逻辑,但实际执行对我来说非常困难。
ALTER TABLE MyTable
ADD GuidCol NVARCHAR(50) NOT NULL,
CONSTRAINT AK_GuidCol UNIQUE(GuidCol)
在上面的代码我试图添加一列GuidCol作为独特的列后谷歌搜索了很多。但是 我不知道如何在新创建的列中填充值? 如何在分配值后将此列作为PK? 如何确保此过程不会破坏现有的外键约束?
答
我不知道如何在新创建的列中填充值?
您所提供的链接给出了解决方案:
创建在主表中的GUID值的新列。使用 uniqueidentifier数据类型,使其不为空,并且newid() 默认因此将填充所有现有行。
所以,你的代码应该是这样的:
alter table myTable add GuidCol uniqueidentifier not null default newid()
我如何分配值(S)后,使该列PK?如何 确保此过程不会破坏现有外键 的约束?
相同的答案告诉你:
- 在子表创建新的唯一标识符列。
- 运行更新语句以使用存在的int关系来引用实体来构建公会关系。
- 删除原始的int列。
使用相同uniqueidentifier
类型的previuos声明,但不是提供defalut
,运行更新语句加入现有的整数id
表,并在孩子的列相应的父值设置。 现在你已经建立了孩子 - 父母关系,但没有对他们的限制。删除int
列,并在新的列上创建PK和FK
什么是手动同步与外键的类型有关?您可能试图解决错误的问题。 –
在手动同步中没有使用外键。但在这里我试图添加新的唯一GUID列。我想这个列是PK,所以我需要更新所有的外键表。例如。如果PK是1,Guid是G,那么我需要改变FK为1到G的其他表中的条目。对不起,写错了。我希望你能得到我想说的话。 – sachin