Sql server 更改列的数据类型/约束

Sql server 更改列的数据类型/约束,sql-server,Sql Server,我有一个现有列people,其中包含一个列pid。我想从以下位置更改pid: int->5个字符长的字符串 唯一->在pid和company\u id中唯一(外键) 我目前没有在mssql数据库中使用pid,因此我可以删除该列。我的理解是,我必须将我的任务分为三个步骤: 下降柱 添加列 为列添加唯一性 我的mssql语句是否如下所示: ALTER TABLE people DROP COLUMN pid; ALTER TABLE people ADD pid VARCHAR(5); ALTE

我有一个现有列
people
,其中包含一个列
pid
。我想从以下位置更改
pid

  • int->5个字符长的字符串

  • 唯一->在
    pid
    company\u id
    中唯一(外键)

我目前没有在mssql数据库中使用
pid
,因此我可以删除该列。我的理解是,我必须将我的任务分为三个步骤:

  • 下降柱
  • 添加列
  • 为列添加唯一性
  • 我的mssql语句是否如下所示:

    ALTER TABLE people DROP COLUMN pid;
    ALTER TABLE people ADD pid VARCHAR(5);
    ALTER TABLE people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
    

    我已经执行了上面的mssql语句,但在我的
    人物
    中没有看到
    pid
    列。我没有注意到抛出任何错误,我想在深入研究之前验证我的语句是否正确。

    我想问题在于批处理失败。可能的原因是,在创建
    约束之前,您需要为
    pid
    设置一个值。如果表中有任何数据且
    公司id
    不唯一,则会有重复的值。因此,作为一个简单的例子,以下内容将起作用:

    CREATE TABLE #people (pid int, company_id int)
    GO
    
    SELECT *
    FROM #people;
    GO
    
    ALTER TABLE #people DROP COLUMN pid;
    ALTER TABLE #people ADD pid VARCHAR(5);
    ALTER TABLE #people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
    GO
    
    SELECT *
    FROM #people;
    GO
    
    DROP TABLE #people;
    
    但是,如果我先在表中输入一些数据,批处理将失败:

    CREATE TABLE #people (pid int, company_id int)
    GO
    
    INSERT INTO #people (company_id)
    VALUES (1),(1),(2);
    GO
    SELECT *
    FROM #people;
    GO
    
    ALTER TABLE #people DROP COLUMN pid;
    ALTER TABLE #people ADD pid VARCHAR(5);
    ALTER TABLE #people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
    GO
    
    SELECT *
    FROM #people;
    GO
    
    DROP TABLE #people;
    
    在本例中,我实际上仍然有列
    pid
    ,但是
    约束失败。根据您处理事务的位置,很可能是
    DROP
    已提交,但是
    ADD
    已使用
    ADD约束回滚


    要解决此问题,您需要首先用相关数据填充(新)列
    pid
    ,然后添加
    约束

    ,那么,您的问题到底是什么?如果是“上面的SQL行得通吗?”您是否尝试过(可能是在开发环境中)?若否,原因为何?去试试吧(再说一次,先使用开发环境,这就是他们的目的)!如果是的,而且确实有效,问题是什么?如果它不起作用,有什么问题吗?@Larnu-Woops,我忘了添加我的问题。我已经尝试了我的语句,但是我再也看不到
    pid
    列了。我也没有看到任何错误。是否刷新SSMS?