1

幾個月前,我接管了一個應用程序,該應用程序使用Guids作爲主表上的主鍵。最近我們一直在討論一些與索引有關的數據庫問題,並且我剛剛讀到了使用Guids作爲主鍵,並且我已經知道他們可能有多少壞主意,而且我認爲它可能會付出代價在數據庫變得太大之前改變它們。將GUID主鍵更改爲整數主鍵

我想知道是否有簡單的方法將它們更改爲Ints?有一些驚人的軟件會爲我做這個嗎?還是完全取決於我?

我在考慮只添加一個額外的Int列以及所有適當的表,寫一些代碼來根據CreationDate列用1-n填充此列,編寫一些更多代碼來填充所有相關表中的列,然後切換與新的int列的關係。聽起來太困難了......這是做這件事的最好方法嗎?

+1

爲什麼你不能只是做一些基於http://stackoverflow.com/questions/3698793/how-to-add-a-new-identity-column-to-a-table-in-sql-server –

+2

檢查http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any-data-loss/6086661#6086661和http:// stackoverflow。 com/questions/17040124/add-an-identity-column-to-existing-table-as-the-primary-key-and-change-order –

+1

我所做的是一個多步驟的過程:(1)找到所有外來的(2)刪除所有外鍵約束,(3)將所有主鍵放在受影響的表上,(4)在這些表上創建新的「ID INT」列,使它們成爲該表上的羣集主鍵,以及(5)恢復外鍵約束。這可以很容易地腳本 –

回答

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 

之前,我創建的作業2臺,因爲這意味着我沒有(從刪除關係分開)接觸到原件工作表,所以如果出現問題,一切都可以很容易地恢復到原來的狀態。