【问题标题】:Alter columns primary key and foreign key VARCHAR datatype to INT datatype将列主键和外键 VARCHAR 数据类型更改为 INT 数据类型
【发布时间】:2017-04-05 18:49:31
【问题描述】:

我使用 SQL Server 2008 R2。 我有 2 个包含数据的表。

  • Area 表有 varchar 主键

  • PersonalData 表引用 Area 表使用 varchar 外键

如何将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

【问题讨论】:

    标签: sql-server sql-server-2008 primary-key sqldatatypes alter-table


    【解决方案1】:

    这是一个多步骤的过程:

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

    您一定要在这里小心,因为可能有其他因素可能会阻止此操作(模式绑定视图、检查约束等)。

    【讨论】:

    • 我唯一要补充的是,您应该首先在测试环境中执行这些步骤。这样你就知道它很有可能在生产中工作。
    • 考虑主键、外键和唯一键,以及索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多