题 更改列:null为非null


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

我在寻找 特定的SQL语法 改变一个列(称之为 ColumnA) 至 ”not null“。假设数据已更新为不包含空值。

运用 SQL server 2000


1025
2018-03-27 13:24


起源


另一件事 - 您可能希望添加一个默认值,即任何未指定列的现有插入都不会失败:ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar - Marc Gravell♦
你也许会对此感到惊讶 在某些情况下 将列更改为 NOT NULL 会导致大量的日志记录。 - Martin Smith


答案:


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

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

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

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

1734
2018-03-27 13:30



让我对上述两个正确答案进行增值。 NULL的语义可以有一些含义。其中一个常见的意思是UNKNOWN。以SCORE为例。一个空的SCORE和一个ZERO SCORE是一个与众不同的世界!在您完成上述建议之前。确保应用程序在其业务逻辑中不采用null。 - TechTravelThink
如果您输入拼写错误并且数据库爆炸,请先备份您的数据库。 - mpen
奇怪的是MS SQL Management Studio不允许这个选项,它吹嘘“Dropping table ...” - Sebastian
应始终备份数据库。您永远不知道您的某个人何时可以编写和更新UPDATE或DELETE语句并忘记WHERE子句。 - Daniel Allen Langdon
@SebastianGodelet:有一个设置允许你关闭那个警告,或者使它不会阻止你修改表。在某些情况下,更改表的架构需要创建一个新表,从旧表和旧表复制的数据将被删除。由于此过程中的错误可能导致数据丢失,因此SSMS会向您发出警告,并且默认情况下会阻止您执行此操作。 - siride


我有同样的问题,但该字段用于默认为null,现在我想将其默认为0.这需要在mdb的解决方案后再添加一行:

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

47
2018-06-15 20:45



这不能解决问题。默认设置已经设置,它是需要更改的NOT NULL。只有您的答案,所有现有记录将保持为NULL并且问题仍然存在。 - PandaWood
您是否阅读过有关“再添加一行”的部分?如此,这是除了上述答案之外? - Greg Dougherty
实际上,没有不清楚“增加一行”意味着“除上述答案之外”(特别是因为上面有很多答案) - 如果这就是你的意思,那么措辞确实需要改变,你应该包括你所指的答案的行 - PandaWood
只是想插入并说明一个明确命名你的约束,包括默认值是一个好主意。如果您需要删除列,则必须先了解要删除的约束的名称。在我们的数据库迁移中进行了几次这样的操作。我知道这个例子包含在这里,但它仍然是一些开发者绊倒的地方,因为这个名字不是必需的。 - jocull


您必须分两步完成:

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

29
2018-03-27 13:34





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

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

否则abatichev的回答似乎很好。你不能重复alter - 它抱怨(至少在SQL Developer中)该列已经不是null。


21
2017-09-17 21:13



看起来在Oracle 11中,您不必重复 datatype。仅仅 columname NOT NULL 足够。看到 文件。 - jpmc26


只要该列不是唯一标识符

UPDATE table set columnName = 0 where columnName is null

然后

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


16
2018-03-27 13:26





这对我有用:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;

15
2018-06-05 13:00





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

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

此外,使用此功能,您还可以添加列,而不仅仅是更改列。 如果值为null,则在此示例中更新为默认值(0)。


5
2018-03-04 07:55



是的,但谷歌指导人们在这里..它收到了很多赞成之所以引起它,以及许多下行道路。我觉得它很有用。每个人都可以自由地忽略这一点,但老实说,我认为这有助于人们。 - csomakk
请阅读SO规则。 我该如何写出一个好的答案? , 及时回答技术问题 和 写出完美的问题。笔记: 不要害怕删除(或严重编辑)无用的答案 和 不要“回答并运行 - Kiquenet


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

步骤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)

STEP3:

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

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

2
2017-11-27 17:13





在我的情况下,我对发布的答案有困难。我最终使用了以下内容:

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

更改 VARCHAR(200) 到您的数据类型,并可选择更改默认值。

如果您没有默认值,则在进行此更改时会出现问题,因为默认值为null会产生冲突。


2
2018-01-26 19:39





使列不为空并添加默认值也可以在SSMS GUI中完成。

  1. 正如其他人已经说过的那样,你不能设置“not null” 现有数据是“非空”,如下所示:

UPDATE myTable SET myColumn = 0

  1. 完成后,在设计视图中使用表格(右键单击 表并单击“设计视图”),您可以取消选中 允许 空值 像这样的列:

enter image description here

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

enter image description here


1
2017-12-15 03:14





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

alter table [table name] alter column [column name] not null;

0
2018-06-13 00:45