将GUID主键更改为整数主键

时间:2013-10-18 10:37:30

标签: sql sql-server primary-key uniqueidentifier clustered-index

几个月前我接管了一个应用程序,它在主表上使用Guids作为主键。我们最近一直有一些与索引相关的数据库问题而且我刚刚开始阅读使用Guids作为主键,并且我已经了解了它们可能有多糟糕的想法,我认为它可能会付出代价在数据库变得太大之前更改它们。

我想知道是否有一种简单的方法可以将它们改为Ints?是否有一些令人惊奇的软件能为我做到这一点?或者这完全取决于我?

我在考虑只添加一个额外的Int列所有适当的表,编写一些代码以使用1-n基于CreationDate列弹出此列,编写更多代码以填充所有相关表中的列,然后切换与新int列的关系。听起来太难了......这是最好的方法吗?

1 个答案:

答案 0 :(得分:0)

在结合上述所有链接的各个部分之后,我想出了这个脚本,为了答案而简化了。

变更前的表格

JOB
Id Guid PK
Name nvarchar
CreationDate datetime

REPORT
Id Guid PK
JobId int
Name nvarchar
CreationDate datetime

SCRIPT

-- Create new Job table with new Id column
select JobId = IDENTITY(INT, 1, 1), Job.*
into Job2
from Job
order by CreationDate


-- Add new JobId column to Report
alter table Report add JobId2 int

-- Populate new JobId column
update Report
set Report.JobId2 = Job2.JobId
from Job2
where Report.JobId = Job2.Id

-- Delete Old Id
ALTER TABLE Job2 DROP COLUMN Id

-- Delete Relationships
ALTER TABLE Report DROP CONSTRAINT [FK_Report_Job]
ALTER TABLE Job DROP CONSTRAINT PK_Job

-- Create Relationships
ALTER TABLE [dbo].[Job2] ADD  CONSTRAINT [PK_Job] PRIMARY KEY CLUSTERED 
([JobId] ASC) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]

ALTER TABLE [dbo].[Report]  WITH CHECK ADD  CONSTRAINT [FK_Report_Job] FOREIGN KEY([JobId2])
REFERENCES [dbo].[Job2] ([JobId])
ON DELETE CASCADE
ALTER TABLE [dbo].[Report] CHECK CONSTRAINT [FK_Report_Job]


-- Rename Columns
sp_RENAME 'Report.JobId', 'OldJobId' , 'COLUMN'
sp_RENAME 'Report.JobId2', 'JobId' , 'COLUMN'

-- Rename Tables
sp_rename Job, Job_Old
sp_rename Job2, Job

我创建了Job2表,因为这意味着我不必触摸原始的Job表(除了删除关系之外),这样一切都可以很容易地恢复到原始状态,以防出现问题。