将一个可为空的列更改为非空列,并设置默认值。

90

今天我遇到一张旧表,其中有一个日期时间列名为'Created',允许为空。现在,我希望将其更改为非空,并添加一个约束以设定默认值(getdate())。

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

ALTER TABLE dbo.MyTable ALTER COLUMN Created DATETIME NOT NULL 

在ALTER语句中,有没有办法同时指定默认值呢?


你想用今天的日期填充所有已存在的记录吗? - froadie
没错,那就够了。 - Jim B
5个回答

110
我认为你需要将这个分成三个独立的语句来完成。我已经查了一下,所有我看到的都表明如果你是在添加一个列的话是可以做到的,但如果你是在修改一个列的话就不行。
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 

15
有其他人真的“尝试”过这个吗?我发现第二个语句由于表格中的空值而失败(即使存在默认值)。在这两个语句之间,您需要插入一个步骤来清除现有的空值。 - Jeremy Stein
5
看起来有人编辑了答案。现在它是正确和完整的。 - Krisztián Balla
为什么我们需要在那里添加约束? - Akmal Salikhov

13

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

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

10

您需要执行两个查询:

第一个 - 将默认值添加到所需列中

ALTER TABLE 'Table_Name' ADD DEFAULT 'value' FOR 'Column_Name'

例如:我想将默认值添加到Column IsDeleted中,如下所示:

ALTER TABLE [dbo].[Employees] ADD Default 0 for IsDeleted

第二个 - 将列值从可空更改为非空

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

例如:我想将列IsDeleted更改为非空

ALTER TABLE [dbo].[Employees] Alter Column IsDeleted BIT NOT NULL


似乎无法与SQL Server一起使用:表中已经存在的空值不会受到影响。 - user2864740

3
如果是SQL Server,你可以在设计视图中的列属性上进行操作。
试试这个:
ALTER TABLE dbo.TableName 
  ADD CONSTRAINT DF_TableName_ColumnName
    DEFAULT '01/01/2000' FOR ColumnName

这需要以脚本形式呈现,以便作为我们自动化发布流程的一部分运行。 - Jim B
仍然不行。约束已添加;但在尝试将NULL转换为NOT NULL时仍会出错。 - Jim B
脚本以将所有的空值更新为默认值并应用它?抱歉,没能提供太多帮助! - BenW
我删除了将 null 转换为非 null 的语句,现在解决方案可以正常工作。由于已定义默认值,所有新条目都会获得我的设置默认值,因此我似乎没有空值的风险。只需确保您的代码在更新语句中永远不会设置空值即可。 - ShadeTreeDeveloper

1

试试这个

ALTER TABLE table_name ALTER COLUMN col_name data_type NOT NULL;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接