Sql server 将列:null更改为notnull

Sql server 将列:null更改为notnull,sql-server,tsql,null,alter-table,alter-column,Sql Server,Tsql,Null,Alter Table,Alter Column,我有一个表,它有几个可为空的整数列。由于几个原因,这是不可取的,因此我希望将所有空值都更新为0,然后将这些列设置为非空。除了将空值更改为0,还必须保留数据 我正在寻找将一列(称之为ColumnA)更改为“notnull”的特定SQL语法。假设数据已更新为不包含空值 使用SQL server 2000。只要列不是唯一标识符 UPDATE table set columnName = 0 where columnName is null 然后 更改表格并将字段设置为非空,并指定默认值0,首先,使所

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

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


使用SQL server 2000。

只要列不是唯一标识符

UPDATE table set columnName = 0 where columnName is null
然后


更改表格并将字段设置为非空,并指定默认值0,首先,使所有当前的
null
值消失:

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL
然后,更新表定义以禁止“null”:


您必须分两步进行:

  • 更新表,使列中没有空值
  • 更改表以更改列的属性

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

    ALTER TABLE [Table] 
    ALTER [Column] NUMBER DEFAULT 0 NOT NULL;
    
    此外,使用此功能,您还可以添加列,而不仅仅是修改列。 在本例中,如果该值为空,它将更新为默认值(0)。

    这对我很有效:

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

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

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

    对于Oracle 11g,我可以按如下方式更改column属性:

    ALTER TABLE tablename MODIFY columnname datatype NOT NULL;
    

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

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

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

    如果出现
    外键约束
    。。。如果主键表的列中不存在“0”,则会出现问题。解决这个问题的办法是

    步骤1:

    RUN UPDATE COMMAND (as mentioned in above comments)
    RUN ALTER COMMAND (as mentioned in above comments)
    
    使用以下代码禁用所有约束:

    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
    
    exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
    
    第二步:

    RUN UPDATE COMMAND (as mentioned in above comments)
    RUN ALTER COMMAND (as mentioned in above comments)
    
    第三步:

    RUN UPDATE COMMAND (as mentioned in above comments)
    RUN ALTER COMMAND (as mentioned in above comments)
    
    使用以下代码启用所有约束:

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

    也可以在SSMS GUI中使列不为null并添加默认值

  • 正如其他人已经说过的,在所有 现有数据为“非空”,如下所示:
  • updatemytable SET myColumn=0

  • 完成后,在设计视图中使用表(右键单击 表并单击“设计视图”),您只需取消选中“允许” 空列,如下所示:
  • 仍然在“设计”视图中选择列,您可以看到 列属性,并在其中将默认值设置为0,如下所示:

  • 就我而言,我对贴出的答案有困难。我最终使用了以下方法:

    ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';
    
    VARCHAR(200)
    更改为您的数据类型,并可以选择更改默认值


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

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

    ALTER TABLE mytable modify mycolumn datatype NOT NULL;
    
    让我们举一个例子:

    TABLE NAME=EMPLOYEE
    
    我想把
    EMPLOYEE\u NAME
    列改为
    notnull
    。此查询可用于以下任务:

    ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;
    
  • 首先确保更改为not的列没有空值 从列的_名称为空的表中选择count(*)

  • 估算缺失的值。可以用空字符串或0、平均值或中值或插值替换空值。这取决于你的后补策略或前补策略

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


  • 还有一件事-您可能希望为未指定列的任何现有插入添加一个默认值:ALTER TABLE FOO add CONSTRAINT FOO\u Bar\u默认值0 FOR Barals所以您可能会惊讶地知道,将列更改为
    NOT NULL
    会导致大量日志记录。让我为上述两个正确的响应添加值。NULL的语义可以有几个含义。其中一个共同的含义是未知的。以分数为例。零分和零分是一个不同的世界!在你做上述建议之前。确保您的应用程序的业务逻辑中没有空值。请首先备份数据库,以防您输入错误和数据库爆炸。应始终备份数据库。你永远不知道你的人什么时候会编写、更新或删除语句,而忘记WHERE子句。我知道这个问题是针对SQLServer的,但这对Postgres 9不太管用。改为使用try:“ALTER TABLE[TABLE]ALTER COLUMN[COLUMN]SET NOT NULL”@SebastianGodelet:有一个设置允许您关闭该警告,或使其不阻止您修改该表。在某些情况下,更改表的架构需要创建一个新表,从旧表复制数据并删除旧表。由于此过程中的错误可能会导致数据丢失,SSMS会警告您,并且默认情况下会阻止您执行此操作。这并不能解决问题。默认值已设置,需要更改的是NOT NULL。只有您的答案,所有现有记录将保持为空,问题仍然存在。您是否阅读了“添加一行”部分?比如,这是在上述答案之外?事实上,不,不清楚“再添加一行”是否意味着“在上述答案之外”(特别是因为“上面”有很多答案)-如果这是你的意思,然后,措辞真的需要改变,你应该包括你提到的答案的那一行,只是想插嘴说,明确命名你的约束是个好主意,包括默认值。如果需要删除列,则必须知道要删除的约束的名称