将可空列更改为具有默认值的非空


74

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

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

ALTER TABLE dbo.MyTable ALTER COLUMN Created DATETIME NOT NULL 

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


您想用今天的日期填充所有现有记录吗?
弗罗蒂(Froadie)2010年

是的 这样就足够了。
Jim B

Answers:


94

我认为您将需要作为三个单独的语句来执行此操作。我一直在环顾四周,我所看到的一切似乎都建议您添加列即可,但如果要更改列则不能。

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 

14
有人真的尝试过吗?我发现第二条语句由于表中的空值而失败(尽管存在默认值)。您需要在这两者之间插入一个步骤,以清除现有的空值。
杰里米·斯坦

3
好像有人编辑了答案。现在它是正确且完整的。
克里斯蒂安·巴拉

为什么我们需要在那里添加约束?
Akmal Salikhov

11

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

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

4

您需要执行两个查询:

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

ALTER TABLE'Table_Name`为'Column_Name'添加默认'值'

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

示例:ALTER TABLE [dbo]。[Employees]添加IsDeleted的默认0

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

ALTER TABLE'table_name'ALTER COLUMN'column_name''data_type'非空

我想使IsDeleted列不为null

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


似乎不适用于SQL Server:表中已存在的空值不受影响。
user2864740

2

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

尝试这个?:

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

它必须采用脚本形式,以便可以在我们的自动发布过程中运行。
Jim B 2010年

仍然没有骰子。约束被添加;但是,当它试图将NULL转换为NOT NULL它仍然barfs
吉姆乙

脚本更新所有空值以将值设置为默认值,然后应用它?抱歉,没有太大帮助!
BenW

我消除了将null转换为not null的语句,并且该解决方案有效。由于定义了默认值,所以我所有的新条目都将设置为默认值,因此似乎没有空值的风险。只要确保您的代码在更新语句中不要设置空值即可。
ShadeTreeDeveloper 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.