【问题标题】:Change a Nullable column to NOT NULL with Default Value使用默认值将 Nullable 列更改为 NOT NULL
【发布时间】:2011-03-12 08:01:24
【问题描述】:

我今天遇到了一张旧表,其中有一个名为“Created”的日期时间列,它允许空值。现在,我想将其更改为 NOT NULL,并且还包含一个要添加默认值 (getdate()) 的约束。

到目前为止,我有以下脚本,只要我事先清理了所有空值,它就可以正常工作:

ALTER TABLE dbo.MyTable ALTER COLUMN Created DATETIME NOT NULL 

有没有办法在 ALTER 语句中也指定默认值?

【问题讨论】:

  • 你想用今天的日期填充所有已经存在的记录吗?
  • 是的;就足够了。

标签: sql sql-server alter-table alter-column


【解决方案1】:

试试这个

ALTER TABLE table_name ALTER COLUMN col_name data_type NOT NULL;

【讨论】:

    【解决方案2】:

    你需要执行两个查询:

    一 - 将默认值添加到所需的列

    ALTER TABLE“表名”为“列名”添加默认“值”

    我想为列 IsDeleted 添加默认值,如下所示:

    示例:ALTER TABLE [dbo].[Employees] 为 IsDeleted 添加默认值 0

    二 - 将可以为空的列值更改为不为空

    ALTER TABLE 'table_name' ALTER COLUMN 'column_name' 'data_type' NOT NULL

    我想让 IsDeleted 列不为空

    ALTER TABLE [dbo].[Employees] 更改列 IsDeleted BIT NOT NULL

    【讨论】:

    • 似乎不适用于 SQL Server:空值已在表中不受影响。
    【解决方案3】:

    我认为您需要将其作为三个单独的语句来执行。我一直在环顾四周,我所看到的一切似乎都表明,如果您要添加一列,则可以这样做,但如果您要更改一列,则不行。

    ALTER TABLE dbo.MyTable
    ADD CONSTRAINT my_Con DEFAULT GETDATE() for created
    
    UPDATE MyTable SET Created = GetDate() where Created IS NULL
    
    ALTER TABLE dbo.MyTable 
    ALTER COLUMN Created DATETIME NOT NULL 
    

    【讨论】:

    • 真的有其他人尝试过这个吗?我发现第二条语句由于表中的空值而失败(尽管存在默认值)。您需要在清除现有空值的那两个步骤之间插入一个步骤。
    • 看起来有人编辑了答案。它现在是正确和完整的。
    • 为什么我们需要在那里添加约束?
    【解决方案4】:

    您可能必须先将所有为空的记录更新为默认值,然后使用 alter table 语句。

    Update dbo.TableName
    Set
    Created="01/01/2000"
    where Created is NULL
    

    【讨论】:

      【解决方案5】:

      如果是 SQL Server,您可以在设计视图中的列属性上执行此操作

      试试这个?:

      ALTER TABLE dbo.TableName 
        ADD CONSTRAINT DF_TableName_ColumnName
          DEFAULT '01/01/2000' FOR ColumnName
      

      【讨论】:

      • 这需要采用脚本形式,以便它可以作为我们自动发布过程的一部分运行。
      • 仍然没有骰子。约束被添加;但是当它尝试将 NULL 转换为 NOT NULL 时仍然会出错
      • 脚本更新所有空值以将值设置为默认值然后应用它?抱歉,帮不上什么忙!
      • 我消除了将 null 转换为非 null 的语句,并且解决方案有效。由于定义了一个默认值,我所有的新条目都得到了我设置的默认值,所以我似乎没有空值的风险。只需确保您的代码永远不会在更新语句中设置空值。
      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2019-10-08
      • 2019-08-23
      • 2013-04-15
      • 2018-01-25
      • 2014-01-16
      • 1970-01-01
      相关资源
      最近更新 更多