【问题标题】:Can I add a not null column without DEFAULT value我可以添加一个没有默认值的非空列吗
【发布时间】:2011-04-29 05:13:54
【问题描述】:

我可以添加一个我指定为 NOT NULL 的列吗,我不想指定 DEFAULT 值但是 MS-SQL 2005 说:

ALTER TABLE 只允许添加可以包含空值的列,或者指定了 DEFAULT 定义,或者添加的列是标识或时间戳列,或者如果前面的条件都不满足,则表必须为空允许添加此列。列 'test' 不能添加到非空表 'shiplist' 中,因为它不满足这些条件。

如果是,请告诉我语法,如果不是,请说明原因。

【问题讨论】:

  • 我认为这样做的目的是使该列可以添加为“NOT NULL”,但指定现有列的值应该是什么,而不必做任何可爱的事情,比如创建一个约束放弃它。对我来说,想要 NOT NULL,没有默认值似乎是合理的,但只需指定现有行的值应该是什么。

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

作为一个选项,您可以最初创建 Null-able 列,然后使用有效的非空值更新表列,最后使用 ALTER 列设置 NOT NULL 约束:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

【讨论】:

    【解决方案2】:

    我使用了以下方法,它对我有用

    Syntax:
    ALTER TABLE <YourTable> ADD <NewColumn> <NewColumnType> NOT NULL DEFAULT <DefaultValue>
    
    Example:
    ALTER TABLE Tablename ADD ColumnName datetime NOT NULL DEFAULT GETDATE();
    

    【讨论】:

      【解决方案3】:

      我使用这种方法插入没有默认值的 NOT NULL 列

      ALTER TABLE [Table] ADD [Column] INT NULL
      GO
      UPDATE [Table] SET [Column] = <default_value>
      ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL
      

      【讨论】:

        【解决方案4】:

        不,你不能。但是可以考虑将默认值指定为('')

        【讨论】:

          【解决方案5】:

          不,你不能。

          因为如果可以的话,SQL 将不知道在已经存在的记录中添加什么作为值。如果您在表中没有任何记录,它将毫无问题地工作。

          最简单的方法是使用默认值创建列,然后删除默认值。

          ALTER TABLE dbo.MyTable ADD
          MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue'
          ALTER TABLE dbo.MyTable
          DROP CONSTRAINT DF_MyTable_MyColumn
          

          另一种选择是添加没有约束的列,填充所有单元格的值并添加约束。

          【讨论】:

            【解决方案6】:

            @Damien_The_Unbeliever's comment , 是添加计算列吗?问题和答案都没有暗示类似的东西。在计算列的情况下,错误状态:

            “只能在计算列上创建 UNIQUE 或 PRIMARY KEY 约束,而 CHECK、FOREIGN KEY 和 NOT NULL 约束要求计算列被持久化”

            好的,如果要继续这个猜谜游戏,这是我的脚本,说明在一个“ALTER TABLE”步骤中添加“NOT NULL”列:

            CREATE TABLE TestInsertComputedColumn 
            (
                FirstName VARCHAR(100),
                LastName CHAR(50)
            );  
            
            insert into TestInsertComputedColumn(FirstName,LastName)
                 select 'v', 'gv8';
            select * from TestInsertComputedColumn;
            
            ALTER TABLE TestInsertComputedColumn 
                  ADD FullName As FirstName + LastName PERSISTED NOT NULL;
            
            select * from TestInsertComputedColumn;
            --drop TABLE TestInsertComputedColumn;
            

            【讨论】:

              【解决方案7】:

              不,您不能,因为 SQL Server 或任何其他数据库引擎会强制此新列为空,以便将现有行添加到您的数据表中。但是由于您不允许 NULL,因此您需要提供默认值以尊重您自己的约束。这很有意义! DBE 不会为现有行的非空值推断值。

              【讨论】:

              • 虽然您所说的确实有道理,但至少有一个“数据库引擎”是 MS Access,它允许在不指定 @ 的情况下将 NOT NULL 列添加到表中987654322@,其结果是NOT NULL 列中的空值。我会提供证据作为答案...
              【解决方案8】:

              没有。

              只需使用空字符串''(如果是字符类型)或0(如果是数字)等作为默认值

              【讨论】:

                【解决方案9】:

                将列添加到表中,更新现有行,使它们都不为空,然后添加“非空”约束。

                【讨论】:

                • 如果新值的逻辑比简单的常量更复杂,这比创建/删除默认值更好。
                • 为什么或如何更新(手动?)+更改为“非空”,而不是通过默认值自动“更新”+更改为“无默认值”(删除默认值)?
                • @vgv8 - 如果每一行中的新值依赖于该行中已有的其他列怎么办?你不能通过默认约束来表达。
                • @Damien_The_Unbeliever,请参阅我的回复 stackoverflow.com/questions/3997966/…。为了获得使用更好格式的理由,我必须提供 am 答案的变体
                • 要了解如何添加“非空”约束,请查看stackoverflow.com/a/689766/138757
                【解决方案10】:

                否 - SQL Server 相当合理地拒绝了这一点,因为 它不知道现有行应该具有什么值

                很容易同时创建一个DEFAULT,然后立即删除它。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-26
                  • 2016-05-12
                  • 2019-09-09
                  相关资源
                  最近更新 更多