更改列:null到不为null


1216

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

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

使用SQL Server 2000


16
另一件事-您可能想要向未添加该列的所有现有插入添加默认值不会失败:ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell

4
同样,您可能会惊讶于在某些情况下将列更改为NOT NULL会导致大量日志记录。
马丁·史密斯

Answers:


2011

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

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

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

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

49
让我为上述两个正确的答案增值。NULL的语义可以具有一些含义。通用含义之一是UNKNOWN。以SCORE为例。空分数和零分数是一个与众不同的世界!在执行上述建议之前。确保您的应用程序的业务逻辑不为空。
TechTravelThink

242
万一您输入错误并导致数据库爆炸,请先备份数据库。
mpen 2010年

20
奇怪的是,MS SQL Management Studio不允许该选项,它吹嘘“ Dropping table ...”
塞巴斯蒂安,

14
数据库应始终备份。您永远不会知道您的员工何时会编写,UPDATE或DELETE语句而忘记WHERE子句。
维维安河

2
@SebastianGodelet:有一个设置可让您关闭该警告或进行警告,以免妨碍您修改表。在某些情况下,更改表的架构需要创建一个新表,从旧表复制过来的数据和旧表都将丢失。由于此过程中的错误可能会导致数据丢失,因此SSMS会警告您,并且默认情况下会阻止您执行此操作。
siride

57

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

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

这不能解决问题。默认值已设置,需要更改的是NOT NULL。仅凭您的回答,所有现有记录都将为NULL,问题仍然存在。
PandaWood

6
您是否阅读了有关“增加一行”的部分?如上,这是除了上面的答案?
格雷格·多尔蒂

7
实际上,不是很清楚,“再增加一行”的意思是“除了上面的答案之外”(特别是因为“上面”有很多答案)-如果这就是您的意思,那么措词确实需要更改,您应该包括您
所提

2
只是想插话并说明确命名您的约束(包括默认值)是个好主意。如果需要删除列,则必须知道要删除的约束的名称。在我们的数据库迁移中遇到了几次。我知道示例包含在这里,但是仍然是某些开发人员经常去的地方,因为不需要名称。
jocull

38

您将必须分两个步骤进行操作:

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

27

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

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

否则,阿巴蒂切夫的答案似乎很好。您无法重复更改-它抱怨(至少在SQL Developer中)该列已经不为空。


看来在Oracle 11中,您不必重复datatype。仅仅columname NOT NULL足够。请参阅文档
jpmc26

18

这为我工作:

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

16

只要该列不是唯一标识符

UPDATE table set columnName = 0 where columnName is null

然后

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


4

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

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

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


是的,但是google将人们引导到这里。我认为它很有用。每个人都可以无视此事,但老实说,我认为并正在帮助人们。
csomakk

请阅读SO规则。我如何写一个好的答案?,帮助技术问题写出完美的问题。注意:不要害怕删除(或大量编辑)无用的答案,也不要“回答并运行”
Kiquenet

4

如果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)

第三步:

使用此代码启用所有约束:

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

4

就我而言,我在张贴答案时遇到困难。我最终使用以下内容:

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

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

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


1

让我们举个例子:

TABLE NAME=EMPLOYEE

我想将列更改EMPLOYEE_NAMENOT NULL。此查询可用于任务:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

请不要大喊大叫,而应使用格式来使您的文章更具可读性。例如,帮助识别代码部分。stackoverflow.com/editing-help
Yunnosch,

另外,请不要用大写字母写更长的文字。它被认为是在互联网上大喊
Zoe

1
@PawanTiwari,请进行完整编辑。您似乎并未解决该帖子的所有问题。大部分是大写的。
哔哔声,

@ double-beep,我会记住这一点。谢谢
Pawan Tiwari

除了格式问题以外,请与您的答案相比,例如Ralph Wiggum,JDM,Rashmi Singh和trooper31的较早答案,这些乍一看似乎在功能上是相同的,但请使其更加明显。因此,似乎有必要指出您解决方案的重点。尽量避免只复制答案的印象……
Yunnosch

0

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

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

0

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

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

UPDATE myTable SET myColumn = 0

  1. 完成此操作后,将表置于设计视图中(右键单击表,然后单击“设计视图”),您可以取消选中“ 允许空值”列,如下所示:

在此处输入图片说明

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

在此处输入图片说明


我看到了反对意见,但没有反馈我什么也无法纠正。请让我知道是否有任何问题。
Tony L.

-1

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

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
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.