【问题标题】:How to set a default value for an existing column如何为现有列设置默认值
【发布时间】:2011-10-11 02:59:10
【问题描述】:

这在 SQL Server 2008 中不起作用:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

错误是:

关键字“SET”附近的语法不正确。

我做错了什么?

【问题讨论】:

标签: sql-server sql-server-2008 tsql default-value


【解决方案1】:

不能为此使用 alter column,请改用 add

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

【讨论】:

  • 不知道为什么这个答案没有得到支持。和之前的一模一样,前面已经回答过了……
【解决方案2】:
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

【讨论】:

  • 这适用于 MSSQL,但它的缺点是它没有命名它在幕后创建的约束(请参阅上面投票率较高的答案)。
  • @Contango 我认为最好不要为需要修改其中一个的机会命名每一个约束。只需写一个procedure for dropping automatically named constraints,你就不必再命名一个+可以处理所有其他未命名的人
  • @Jonny Leeds。好点子。我也喜欢命名约束,因为它对于任何试图修改(或简单理解)数据库模式的人来说都是很好的文档。如果一个人是一个单独的操作员,在一个人的团队中工作,这一点就不那么重要了。
  • (EESH!抱歉缺少换行符 - 为了清楚起见,粘贴在下面!)我需要它可以重新运行并找到这种方法来检查它是否已经完成......如果存在(SELECT * FROM information_schema.columns WHERE table_name='myTable' AND column_name='myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL) BEGIN ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] END跨度>
  • 如果只有一个默认约束...为什么要命名它?看起来其他数据库引擎提供了用于添加、更新、删除除了列名之外没有任何名称的列的默认值的语法,这是有道理的。顺便说一句,如果默认值已经存在,上面的代码将失败。 SQL Server 要求对系统表进行复杂的连接只是为了识别默认约束的名称,这很荒谬,因为一列上只能有一个默认约束,所以这不是必需的。
【解决方案3】:

这将在 SQL Server 中工作:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

【讨论】:

  • +1 用于指定约束名称,因此 SQL Server 不会创建随机名称。
  • MSSQL 调用默认值“约束”很奇怪。如果有的话,它们是放松;约束的相反!它们使更多的东西有效,而不是更少。
  • 如果您以另一种方式思考,这并不奇怪:如果您不指定列,默认约束会阻止 MSSQL 抛出错误。所以它不是对用户的约束,而是对 MSSQL 的约束。
  • 这仅适用于列上不存在现有默认约束的情况。
  • @fallenidol 这仅在列上没有现有默认约束时才有效。 对,因为根据定义,您不能拥有多个 默认 价值...
【解决方案4】:
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]

【讨论】:

    【解决方案5】:

    试试下面的命令;

    ALTER TABLE Person11
    ADD CONSTRAINT col_1_def
    DEFAULT 'This is not NULL' FOR Address
    

    【讨论】:

      【解决方案6】:

      正确的做法如下:

      1. 运行命令:

        sp_help [table name] 
        
      2. 复制CONSTRAINT的名称。

      3. 删除DEFAULT CONSTRAINT

        ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
        
      4. 运行以下命令:

        ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]
        

      【讨论】:

      • StackOverflow.com 仅提供英文版本。葡萄牙语网站是pt.stackoverflow.com
      • 这不会为其他答案添加任何新内容,是一种手动方法 - 无法编写脚本,并且它声明为“正确的方法”..
      【解决方案7】:

      有两种情况可以更改列的默认值,

      1. 创建表时
      2. 修改现有表的现有列。

      1. 在创建表/创建新列时。

      查询

      create table table_name
      (
          column_name datatype default 'any default value'
      );
      
      1. 修改现有表的现有列

      在这种情况下,我的 SQL 服务器不允许修改现有的默认约束值。因此,要更改默认值,我们需要删除现有的系统生成或用户生成的默认约束。然后可以为特定列设置默认值。

      执行一些步骤:

      1. 列出所有现有的列默认值约束。

      执行这个系统数据库过程,它以表名作为参数。它返回表中所有列的所有约束的列表。

      execute [dbo].[sp_helpconstraint] 'table_name'
      
      1. 删除列的现有默认约束。

      语法:

      alter table 'table_name' drop constraint 'constraint_name'
      
      1. 为该列添加新的默认值约束:

      语法:

      alter table 'table_name' add default 'default_value' for 'column_name'
      

      干杯@!!!

      【讨论】:

        【解决方案8】:

        Hoodaticus 的解决方案非常完美,谢谢,但我还需要它可以重新运行并找到这种方法来检查它是否已经完成......

        IF EXISTS(SELECT * FROM information_schema.columns 
                   WHERE table_name='myTable' AND column_name='myColumn' 
                     AND Table_schema='myDBO' AND column_default IS NULL) 
        BEGIN 
          ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
        END
        

        【讨论】:

          【解决方案9】:

          就像 Yuck 的回答一样,通过检查允许脚本多次运行而不会出错。 (比使用 information_schema.columns 更少的代码/自定义字符串)

          IF object_id('DF_SomeName', 'D') IS NULL BEGIN
              Print 'Creating Constraint DF_SomeName'
             ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
          END
          

          【讨论】:

            【解决方案10】:

            刚刚找到 3 个简单的步骤来更改之前为空的现有列

            update   orders
            set BasicHours=0 where BasicHours is null
            
            alter table orders 
            add default(0) for BasicHours
            
            alter table orders 
            alter  column CleanBasicHours decimal(7,2) not null 
            

            【讨论】:

              【解决方案11】:

              首次放置约束

              https://stackoverflow.com/a/49393045/2547164

              DECLARE @ConstraintName nvarchar(200)
              SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
              WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
              AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                                      WHERE NAME = N'__ColumnName__'
                                      AND object_id = OBJECT_ID(N'__TableName__'))
              IF @ConstraintName IS NOT NULL
              EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)
              

              第二次创建默认值

              ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]
              

              【讨论】:

                【解决方案12】:

                如果已经存在使用默认名称的限制:

                -- Drop existing default constraint on Employee.CityBorn
                DECLARE @default_name varchar(256);
                SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
                EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);
                
                -- Add default constraint on Employee.CityBorn
                ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;
                

                【讨论】:

                  【解决方案13】:

                  您可以使用以下语法,有关更多信息,请参阅此问题和答案:Add a column with a default value to an existing table in SQL Server

                  语法:

                  ALTER TABLE {TABLENAME} 
                  ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
                  CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
                  WITH VALUES
                  

                  例子:

                  ALTER TABLE SomeTable
                  ADD SomeCol Bit NULL --Or NOT NULL.
                  CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
                  autogenerated.
                  DEFAULT (0)--Optional Default-Constraint.
                  WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.
                  

                  另一种方式:

                  右击表格并点击设计,然后点击要设置默认值的列。

                  然后在页面底部添加一个默认值或绑定:类似 '1' 表示字符串或 1 表示 int。

                  【讨论】:

                    【解决方案14】:
                    ALTER TABLE tblUser
                     ADD CONSTRAINT DF_User_CreatedON DEFAULT GETDATE() FOR CreatedOn
                    

                    【讨论】:

                    • 这与十年前在 the accepted answer 上提出的语法相同——但奇怪的是,它选择不使用作者在原始问题中明确建立的标识符或数据类型,从而使其更少相关的。
                    猜你喜欢
                    • 2014-06-01
                    • 2017-08-31
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-12-28
                    • 1970-01-01
                    • 2019-08-17
                    • 2011-08-31
                    • 2020-12-14
                    相关资源
                    最近更新 更多