在数据库项目中将 Int 更改为 uniqueidentifier

Posted

技术标签:

【中文标题】在数据库项目中将 Int 更改为 uniqueidentifier【英文标题】:Changed Int to uniqueidentifier in a Database Project 【发布时间】:2017-03-31 15:27:46 【问题描述】:

我想在数据库项目中将主键列从 int 更改为 uniqueidentifier。我尝试更改类型但得到可预测的错误,因为 SQL Server 无法将 int 转换为 guid。 (Original Image):

+ ------------ + -------------- + ----------- + ------- +
| Name         | Data_Type      | Allow Nulls | Default |
+ ------------ + -------------- + ----------- + ------- +
| OrderImageId | int            | No          |         |
| OrderId      | int            | No          |         |
| Image        | varbinary(MAX) | Yes         |         |
| FileName     | nvarchar(Max)  | Yes         |         |
+ ------------ + -------------- + ----------- + ------- +

create table [dbo].[OrderImages]
(
    [OrderImageId] int not null primary key identity,
    [OrderId] int not null
        Constraint [FK_OrderImages_Orders] foreign key (OrderId) references [Orders]([OrderId]),
    [Image] varbinary(Max) null,
    [FileName] nvarchar(max) null
)

我知道如何在 SQL Server Management Studio 中执行此操作(创建一个单独的 guid 列、填充它、删除 PK、为 guid 列设置 PK 等),但是可以在数据库项目中执行此操作吗?如果我的 PK 列有 FK 怎么办?

【问题讨论】:

【参考方案1】:

为此,您需要创建一个新表并迁移数据,替换您要用来替换现有整数数据的 guid。

话虽如此,在这里使用唯一标识符并不是一个好主意。 128 位本质上是随机的数据会导致碎片。如果您希望每个订单有超过 40 亿张图像,并且可能有多个图像,则可以使用 bigint。

如果每个订单不超过一张图片,您可以使用 OrderID 作为主键(没有身份约束),避免需要在 OrderID 上添加非聚集索引。

【讨论】:

以上是关于在数据库项目中将 Int 更改为 uniqueidentifier的主要内容,如果未能解决你的问题,请参考以下文章

如何在Mongodb中将字符串数据类型大量更改为int?

在分类/聚类任务中将文本值更改为 int

如何在 C++ 中将值 char 数组的类型更改为 int? [复制]

如何在由科学记数法组成的列表中将字符串更改为 int

在 Eclipse CDT 中将项目类型从“可执行”更改为“静态库”

在 SwiftUI 中将选取器更改为文本字段