【问题标题】:How Can I ALTER COLUMN to NOT NULL and ADD PRIMARY KEY in the same SQL如何将列更改为 NOT NULL 并在同一 SQL 中添加主键
【发布时间】:2017-08-25 06:55:46
【问题描述】:

我有一列 my_id 已设置为 varchar(50) NULL。现在我想将其更改为NOT NULL 并将其添加为该表的primary key。由于还没有其他主键。 我写的如下。

ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;

ALTER TABLE my_details
ADD PRIMARY KEY (my_id); 

但我得到一个错误:

无法在表 'my_details' 中为可为空的列定义 PRIMARY KEY 约束。无法创建约束。查看以前的错误。

如何为此编写单个查询?

【问题讨论】:

  • 您不能在单个查询中执行此操作 - 您需要两个步骤 - 首先将列转换为 NOT NULL,然后在第二步中,将主键约束添加到具有新非- 可空列

标签: sql-server sql-server-2005


【解决方案1】:

只需在两个命令之间放置一个GO,以分别执行它们:

ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;

GO

ALTER TABLE my_details
ADD PRIMARY KEY (my_id); 

【讨论】:

    【解决方案2】:

    使用 GO 并不总是一种选择,例如在存储过程中。

    我的解决方法是使用动态 SQL 来绕过过度的、过早的模式验证:

    create table #test(ID int not null, ForeignKeyID int null)
    alter table #test alter column ForeignKeyID int not null
    exec ('alter table #test add primary key(ID, ForeignKeyID)')
    

    当然,正如 Cool_Br33ze 所提到的,您需要确保事先更新的列中没有 NULL。

    附:我无法直接重现该错误,但已经看到它发生(不幸的是在 PROD 上)。

    【讨论】:

      【解决方案3】:

      如果这是一个在 my_id 列中有空值的现有表,那么您必须先更新该列以删除空值

      CREATE TABLE my_details ( my_id varchar(50) NULL )
      GO
      
      INSERT INTO dbo.my_details ( my_id ) VALUES (NULL  )
      GO
      
      ALTER TABLE my_details
      ALTER COLUMN my_id varchar(50) NOT NULL;
      GO
      

      给你这个错误

      消息 515,级别 16,状态 2,第 9 行无法将值 NULL 插入 列“my_id”,表“xStuff.dbo.my_details”;列不允许 空值。更新失败。

      尝试添加主键会给你这个

      ALTER TABLE my_details
      ADD PRIMARY KEY (my_id); 
      GO
      

      消息 8111,级别 16,状态 1,第 16 行无法定义主键 对表“my_details”中可空列的约束。消息 1750,级别 16,状态 0,第 16 行无法创建约束。查看以前的错误。

      然而

      在两者之间进行更新,此更改有效

      CREATE TABLE my_details ( my_id varchar(50) NULL );
      GO
      
      INSERT INTO dbo.my_details ( my_id ) VALUES (NULL  );
      GO
      
      UPDATE dbo.my_details SET my_id = '' WHERE my_id IS NULL;
      GO
      
      ALTER TABLE my_details
      ALTER COLUMN my_id varchar(50) NOT NULL;
      GO
      
      ALTER TABLE my_details
      ADD PRIMARY KEY (my_id); 
      GO
      

      【讨论】:

        【解决方案4】:

        1 步:使您的列不为空 query-> alter table employees alter column emp_id integer NOT NULL;

        2 步:现在在更新列后将主键添加到该列中 查询 -> 更改表员工 ADD PRIMARY KEY (emp_id);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-23
          • 1970-01-01
          • 1970-01-01
          • 2015-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多