更改列:null 到非 null

Altering a column: null to not null

提问人:Karmic Coder 提问时间:3/27/2009 最后编辑:MarkoKarmic Coder 更新时间:5/1/2021 访问量:1567906

问:

我有一个表,它有几个可为 null 的整数列。由于多种原因,这是不可取的,因此我希望将所有空值更新为 0,然后将这些列设置为 .除了将 null 更改为 之外,还必须保留数据。NOT NULL0

我正在寻找特定的 SQL 语法来将列(调用它)更改为“”。假设数据已更新为不包含 null。ColumnAnot null

使用 SQL Server 2000

sql-server t-sql null alter-table alter-column

评论

19赞 Marc Gravell 3/27/2009
另一件事 - 您可能希望添加默认值,以便任何未指定列的现有插入都不会失败: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
5赞 Martin Smith 8/31/2013
此外,您可能会惊讶地发现,在某些情况下,将列更改为可能会导致大量日志记录。NOT NULL

答:

15赞 Eppz 3/27/2009 #1

只要该列不是唯一标识符

UPDATE table set columnName = 0 where columnName is null

然后

更改表并将字段设置为非 null,并指定默认值 0

2201赞 mdb 3/27/2009 #2

首先,使所有当前值消失:NULL

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

然后,更新表定义以禁止“NULL”:

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

评论

252赞 mpen 9/1/2010
首先备份您的数据库,以防您打错字并且数据库爆炸。
59赞 TechTravelThink 3/27/2009
让我对上述两个正确的回答进行增值。NULL 的语义可以有几种含义。其中一个常见含义是 UNKNOWN。以SCORE为例。零分数和零分数是天壤之别!在执行上述建议之前。确保应用程序在其业务逻辑中不采用 null。
16赞 Vivian River 10/8/2013
应始终备份数据库。你永远不知道你的员工什么时候会写 UPDATE 或 DELETE 语句而忘记 WHERE 子句。
6赞 John Bowers 10/29/2014
我知道这个问题是针对 SQLServer 的,但这对 Postgres 9 不太有效。改用 try: “ALTER TABLE [Table] ALTER COLUMN [COLUMN] SET NOT NULL”
2赞 siride 3/16/2015
@SebastianGodelet:有一个设置允许您关闭该警告,或者设置该警告,以免阻止您修改表格。在某些情况下,更改表的架构需要创建一个新表,从旧表复制数据并删除旧表。由于此过程中的错误可能会导致数据丢失,因此 SSMS 会发出警告,默认情况下会阻止你执行此操作。
41赞 Ralph Wiggum 3/27/2009 #3

您必须分两步完成:

  1. 更新表,使列中没有 null。
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. 更改表以更改列的属性
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

评论

0赞 Elyas Hadizadeh 1/6/2021
SET MyNullableColumn = 0仅当现有列为数值列时才有效。对于非数字类型,您需要设置另一个默认值,例如空字符串或默认日期等。但这个答案与上述问题完全相关并且是正确的;
4赞 csomakk 3/4/2012 #4

这似乎更简单,但仅适用于 Oracle:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

此外,有了这个,您还可以添加列,而不仅仅是更改它。 在此示例中,如果该值为 null,则该值将更新为默认值 (0)。

22赞 Dheeraj Sam 6/5/2012 #5

这对我有用:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;
66赞 Greg Dougherty 6/16/2012 #6

我遇到了同样的问题,但是该字段曾经默认为null,现在我想将其默认为0。这需要在 mdb 的解决方案之后再添加一行:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

评论

0赞 PandaWood 8/26/2015
这并不能解决问题。默认值已经设置,需要更改的是 NOT NULL。只有您的答案,所有现有记录都将保持 NULL 状态,问题仍然存在。
7赞 Greg Dougherty 8/28/2015
你读过关于“再加一行”的部分吗?如上所述,这是对上述答案的补充吗?
8赞 PandaWood 8/28/2015
实际上,不,不清楚“再加一行”是否意味着“除了上面的答案”(特别是因为“上面”有很多答案)——如果这就是你的意思,那么措辞确实需要改变,你应该包括你所指的答案的那一行
4赞 jocull 2/22/2017
只是想插话说,显式命名你的约束是个好主意,包括默认值。如果需要删除列,则必须先知道要删除的约束的名称,然后才能删除。在我们的数据库迁移中遇到过几次。我知道这个例子包含在这里,但它仍然是一些开发人员绊倒的地方,因为不需要名称。
31赞 JDM 9/18/2012 #7

对于 Oracle 11g,我能够更改列属性,如下所示:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

否则,阿巴蒂切夫的回答似乎不错。您不能重复更改 - 它抱怨(至少在 SQL Developer 中)该列已经不为 null。

评论

0赞 jpmc26 6/30/2018
在 Oracle 11 中,您似乎不必重复 .仅仅就足够了。请参阅文档datatypecolumname NOT NULL
0赞 trooper31 6/13/2014 #8

对于 JDK(Oracle 支持的 Apache Derby 发行版)中包含的内置 javaDB,以下内容对我有用

alter table [table name] alter column [column name] not null;
5赞 sam05 11/28/2014 #9

万一......如果主键表的列中不存在“0”,则会出现问题。解决方案是......FOREIGN KEY CONSTRAINT

步骤1:

使用以下代码禁用所有约束:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

步骤2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

步骤3:

使用以下代码启用所有约束:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
1赞 Tony L. 12/15/2015 #10

还可以在 SSMS GUI 中将列设置为非 null 并添加默认值。

  1. 正如其他人已经指出的那样,您不能设置“not null”,直到所有 现有数据为“非 null”,如下所示:

UPDATE myTable SET myColumn = 0

  1. 完成后,将表格置于设计视图中(右键单击 表,然后单击“设计视图”),您只需取消选中“允许”即可 像这样为 Null 列:

enter image description here

  1. 仍然在选择列的设计视图中,您可以在下面的窗口中看到列属性,并将默认值设置为 0,如下所示:

enter image description here

4赞 Philip Kirkbride 1/27/2017 #11

就我而言,我对发布的答案有困难。我最终使用了以下内容:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

更改为数据类型,并选择性地更改默认值。VARCHAR(200)

如果没有默认值,则在进行此更改时会遇到问题,因为默认值为 null,从而产生冲突。

1赞 Rashmi singh 11/12/2018 #12

您可以使用以下 sql 更改现有数据库列的定义。

ALTER TABLE mytable modify mycolumn datatype NOT NULL;

评论

0赞 Chesare 11/15/2023
我需要使用“alter column”(“modify”不起作用)
1赞 Ashish Dwivedi 4/26/2019 #13

让我们举个例子:

TABLE NAME=EMPLOYEE

我想将列更改为 .此查询可用于以下任务:EMPLOYEE_NAMENOT NULL

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

评论

0赞 that_noob 7/28/2022
如何为多列执行此操作?例如,使 employee_name 和 employee_email 同时不为 null?语法是什么?下面的语法给出错误 alter table employee alter column employee_name varchar(20) not null, alter column employee_email varchar(20) not null;
0赞 Golden Lion 5/1/2021 #14
  1. 首先,确保您更改为 not 的列没有 null 值 从表中选择 count(*),其中 column's_name 为 null

  2. 插补缺失值。您可以将 null 替换为空字符串或 0、平均值或中值或插值。这取决于您的回填策略或正向填充策略。

  3. 确定列值是必须是唯一的还是非唯一的。如果它们需要是唯一的,则添加唯一约束。否则,请查看性能是否足够,或者是否需要添加索引。