更改列:null为非null

时间:2009-03-27 13:24:29

标签: sql-server tsql null alter-table alter-column

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

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

使用 SQL server 2000

14 个答案:

答案 0 :(得分:1902)

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

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

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

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

答案 1 :(得分:52)

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

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

答案 2 :(得分:35)

您必须分两步完成:

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

答案 3 :(得分:25)

对于Oracle 11g,我能够按如下方式更改列属性:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

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

答案 4 :(得分:17)

这对我有用:

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

答案 5 :(得分:16)

只要该列不是唯一标识符

UPDATE table set columnName = 0 where columnName is null

然后

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

答案 6 :(得分:5)

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

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

此外,通过此功能,您还可以添加列,而不仅仅是更改列。 如果值为null,它将更新为此示例中的默认值(0)。

答案 7 :(得分:3)

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

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

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

如果您没有默认值,那么您在进行此更改时会遇到问题,因为默认设置为null会导致冲突。

答案 8 :(得分:2)

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

<强> STEP1:

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

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

<强> STEP2:

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"

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

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

    1. 完成后,在设计视图中使用表格(右键单击 表并单击“设计视图”),您只需取消选中允许 Nulls 列如下:
    2. enter image description here

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

答案 11 :(得分:0)

让我们举个例子:

TABLE NAME=EMPLOYEE

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

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

答案 12 :(得分:0)

  1. 首先确保您更改为 not 的列没有空值 select count(*) from table where column's_name is null

  2. 估算缺失值。您可以用空字符串或 0 或平均值或中值或内插值替换空值。这取决于您的回填策略或向前填充策略。

  3. 决定列值是否需要唯一或非唯一。如果它们需要唯一而不是添加唯一约束。否则,看看性能是否足够或者是否需要添加索引。

答案 13 :(得分:-1)

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

ALTER TABLE mytable modify mycolumn datatype NOT NULL;