更改列:null为非null

Kar*_*der 1177 t-sql sql-server null alter-table alter-column

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

我正在寻找特定的SQL语法来将列(调用它ColumnA)改为" not null".假设数据已更新为不包含空值.

使用SQL Server 2000.

mdb*_*mdb 1958

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

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
Run Code Online (Sandbox Code Playgroud)

  • 如果您输入错字并且数据库爆炸,请先备份您的数据库. (239认同)
  • 让我对上述两个正确答案进行增值.NULL的语义可以有一些含义.其中一个常见的意思是UNKNOWN.以SCORE为例.一个空的SCORE和一个ZERO SCORE是一个与众不同的世界!在您完成上述建议之前.确保应用程序在其业务逻辑中不采用null. (47认同)
  • 奇怪的是MS SQL Management Studio不允许这个选项,它吹嘘"Dropping table ..." (19认同)
  • 应始终备份数据库.您永远不知道您的某个人何时可以编写和更新或删除语句并忘记WHERE子句. (14认同)
  • 我知道这个问题是针对 SQLServer 的,但这对 Postgres 9 不太适用。而是使用尝试:“ALTER TABLE [Table] ALTER COLUMN [COLUMN] SET NOT NULL” (5认同)
  • @SebastianGodelet:有一个设置允许你关闭该警告,或者使它不会阻止你修改表.在某些情况下,更改表的架构需要创建一个新表,删除从旧表和旧表复制的数据.由于此过程中的错误可能导致数据丢失,因此SSMS会向您发出警告,并且默认情况下会阻止您执行此操作. (2认同)
  • 您是否必须重新输入该列(假设我不想全部查找)或者我可以省略该部分吗? (2认同)

Gre*_*rty 56

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

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];
Run Code Online (Sandbox Code Playgroud)

  • 实际上,没有不清楚"再增加一行"意味着"除上述答案之外"(特别是因为上面有很多答案) - 如果这就是你的意思,那么措辞确实需要改变,你应该包括你所指的答案的行 (6认同)
  • 您是否阅读过有关"再添加一行"的部分?如此,这是除了上述答案之外? (5认同)
  • 只是想插话说,明确命名您的约束(包括默认值)是个好主意。如果您需要删除列,则必须先知道要删除的约束的名称,然后才能删除。在我们的数据库迁移中遇到过几次。我知道这个例子在这里包含它,但它仍然是一些开发人员绊倒的地方,因为不需要名称。 (3认同)

Ral*_*gum 37

您必须分两步完成:

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


小智 27

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

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;
Run Code Online (Sandbox Code Playgroud)

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


Dhe*_*Sam 17

这对我有用:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;
Run Code Online (Sandbox Code Playgroud)


Epp*_*ppz 16

只要该列不是唯一标识符

UPDATE table set columnName = 0 where columnName is null
Run Code Online (Sandbox Code Playgroud)

然后

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


cso*_*akk 5

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

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;
Run Code Online (Sandbox Code Playgroud)

此外,通过这种方式,您还可以添加列,而不仅仅是更改列.如果值为null,则在此示例中更新为默认值(0).


sam*_*m05 5

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

第1步:

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

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
Run Code Online (Sandbox Code Playgroud)

第2步:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)
Run Code Online (Sandbox Code Playgroud)

第3步:

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

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Run Code Online (Sandbox Code Playgroud)