几个月前,我接管了一个应用程序,该应用程序在主表上使用Guid作为主键。最近我们遇到了一些与索引相关的数据库问题,我刚刚阅读了如何使用Guids作为主键,我已经了解到它们有多么糟糕,我认为在数据库变得太大之前,可能会对它们进行修改。
我想知道是否有一种简单的方法把它们改成Ints?有什么了不起的软件能帮我做到这一点吗?还是我说了算?
我正在考虑添加一个额外的Int列--所有适当的表,编写一些代码,根据CreationDate列使用1-n标记这个列,编写更多的代码来填充所有相关表中的列,然后将关系切换到新的int列。听起来并不难..。这是最好的方法吗?
发布于 2013-10-21 14:23:46
在结合了以上所有链接的片段之后,我想出了这个脚本,为了答案而简化了这个脚本。
更改前的表
JOB
Id Guid PK
Name nvarchar
CreationDate datetime
REPORT
Id Guid PK
JobId int
Name nvarchar
CreationDate datetime剧本
-- 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表是因为它意味着我不必触摸原始的作业表(除了删除关系),这样一切都可以很容易地恢复到原来的状态,以防出问题。
https://stackoverflow.com/questions/19447573
复制相似问题