【问题标题】:Altering a column: null to not null更改列:null 到 not null
【发布时间】:2010-10-15 22:35:12
【问题描述】:

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

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

使用SQL server 2000

【问题讨论】:

  • 另一件事 - 您可能想要添加一个默认值,以确保任何未指定列的现有插入不会失败:ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
  • 您可能会惊讶地发现under some circumstances 将列更改为NOT NULL 会导致大量日志记录。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 让我对以上两个正确答案进行增值。 NULL 的语义可以有几个含义。常见的含义之一是未知。以 SCORE 为例。零分数和零分数是天壤之别!在您执行上述建议之前。确保您的应用程序在其业务逻辑中不采用 null。
  • 首先备份你的数据库,以防你打错了数据库。
  • 应始终备份数据库。您永远不知道您的某个人何时会编写 UPDATE 或 DELETE 语句并忘记 WHERE 子句。
  • 我知道这个问题是针对 SQLServer 的,但这对 Postgres 9 来说不太适用。而是使用 try: "ALTER TABLE [Table] ALTER COLUMN [COLUMN] SET NOT NULL"
  • @SebastianGodelet:有一个设置允许您关闭该警告,或使其不会阻止您修改表格。在某些情况下,更改表的模式需要创建一个新表,从旧表复制数据并删除旧表。由于此过程中的错误可能导致数据丢失,因此 SSMS 会向您发出警告,并且默认情况下会阻止您这样做。
【解决方案2】:

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

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

【讨论】:

  • 这并不能解决问题。默认值已经设置,需要更改的是 NOT NULL。只有您的回答,所有现有记录都将保持 NULL 并且问题仍然存在。
  • 你读过关于“多加一行”的部分吗?如在,这是对上述答案的补充?
  • 实际上,不,不清楚“再添加一行”的意思是“除了上述答案之外”(特别是因为“上面”有很多答案) - 如果这就是你的意思,那么措辞确实需要改变,你应该包括你提到的答案行
  • 只是想插话说,明确命名约束是个好主意,包括默认值。如果您需要删除一列,您必须知道要删除的约束的名称,然后才能删除。在我们的数据库迁移中遇到过几次。我知道这个例子在这里包括了它,但它仍然是一些开发人员绊倒的地方,因为名称不是必需的。
【解决方案3】:

您必须分两步完成:

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

【讨论】:

  • SET MyNullableColumn = 0 仅在现有列是数字列时才有效。对于非数字类型,您需要设置另一个默认值,例如空字符串或默认日期等。但是这个答案与上述问题完全相关并且正确;-)
【解决方案4】:

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

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

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

【讨论】:

  • 看来在Oracle 11 中,您不必重复datatype。仅仅columname NOT NULL 就足够了。见the documentation
【解决方案5】:

这对我有用:

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

【讨论】:

    【解决方案6】:

    只要列不是唯一标识符

    UPDATE table set columnName = 0 where columnName is null
    

    然后

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

    【讨论】:

      【解决方案7】:

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

      第 1 步:

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

      EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
      

      第二步:

      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"
      

      【讨论】:

        【解决方案8】:

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

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

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

        【讨论】:

          【解决方案9】:

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

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

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

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

          【讨论】:

            【解决方案10】:

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

            1. 正如其他人已经说过的,您不能设置“not null”,直到所有 现有数据为“非空”,如下所示:

            UPDATE myTable SET myColumn = 0

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

            1. 仍处于选定列的设计视图中,您可以看到 Column Properties 在下面的窗口中,并将默认设置为 0,如下所示:

            【讨论】:

              【解决方案11】:

              举个例子:

              TABLE NAME=EMPLOYEE
              

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

              ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;
              

              【讨论】:

                【解决方案12】:

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

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

                【讨论】:

                  【解决方案13】:

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

                  ALTER TABLE mytable modify mycolumn datatype NOT NULL;
                  

                  【讨论】:

                    【解决方案14】:
                    1. 首先确保您更改为 not 的列没有空值 从 column's_name 为 null 的表中选择 count(*)

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

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

                    【讨论】:

                      猜你喜欢
                      • 2019-08-23
                      • 2010-12-27
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-08-26
                      • 2021-09-15
                      相关资源
                      最近更新 更多