3

我使用SQL Server 2008 R2。 我有2个包含数据的表。将列主键和外键VARCHAR数据类型更改为INT数据类型

  • Area表有VARCHAR使用AreaVARCHAR主键

  • PersonalData表引用外键

我怎样才能改变一个varchar主键和外键int数据类型?

SQL脚本:

CREATE TABLE [dbo].[Z.Tests.Area] 
(
    [ID_Area] [varchar](50) NOT NULL, 
    [Description] [varchar](150) NULL, 

    CONSTRAINT [PK_Z.Tests.Area] 
     PRIMARY KEY CLUSTERED ([ID_Area] ASC) 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Z.Tests.PersonalData] 
(
    [ID_PersonalData] [int] IDENTITY(1,1) NOT NULL, 
    [Username] [varchar](50) NULL, 
    [FK_ID_Area] [varchar](50) NULL, 

    CONSTRAINT [PK_Z.Tests.PersonalData] 
     PRIMARY KEY CLUSTERED ([ID_PersonalData] ASC) 
) ON [PRIMARY] 

ALTER TABLE [dbo].[Z.Tests.PersonalData] WITH CHECK 
    ADD CONSTRAINT [FK_Z.Tests.PersonalData_Z.Tests.Area] 
    FOREIGN KEY([FK_ID_Area]) 
     REFERENCES [dbo].[Z.Tests.Area] ([ID_Area]) 
GO 

ALTER TABLE [dbo].[Z.Tests.PersonalData] 
CHECK CONSTRAINT [FK_Z.Tests.PersonalData_Z.Tests.Area] 
GO 

回答

2

它是一个多步骤的过程:

  1. 检查数据是干净的,转换为int
  2. 删除外键约束和所有索引FK_ID_Area
  3. 删除主键约束和ID_Area
  4. 012的任何索引
  5. ALTER TABLE [Z.Tests.Area] ALTER COLUMN [ID_Area] int Not Null;
  6. ALTER TABLE [Z.Tests.PersonalData] ALTER COLUMN [FK_ID_Area] int Null;
  7. 重新创建主键和索引
  8. 重新创建外键和索引

你肯定会想,因为有可能会阻止这样做可能其他的东西要小心这里(模式化视图,检查约束等)。

+0

我唯一要补充的是你应该先在测试环境中执行这些步骤。这样你就知道它很有可能在生产中工作。 –

+0

***考虑***:_Primary密钥,外键和唯一密钥以及索引_ – Kiquenet