关于sql server:如何为现有列设置默认值

How to set a default value for an existing column

这在SQL Server 2008中不起作用:

1
ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

错误是:

Incorrect syntax near the keyword 'SET'.

我做错什么了?


这将在SQL Server中工作:

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


1
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn


不能对此使用alter列,请改用add

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


正确的方法如下:

  • 运行命令:

    1
    sp_help [table name]

  • 复制CONSTRAINT的名称。

  • 放下DEFAULT CONSTRAINT

    1
    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT]

  • 运行以下命令:

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

  • Hoodaticus的解决方案是完美的,谢谢,但我也需要它重新运行,并找到这种方式来检查是否已经完成了……

    1
    2
    3
    4
    5
    6
    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


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

  • 创建表时
  • 修改现有表的现有列。
  • 在创建表/创建新列时。
  • 查询

    1
    2
    3
    4
    create table table_name
    (
        column_name datatype default 'any default value'
    );

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

    遵循以下步骤:

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

    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'

    干杯@!!!!


    1
    ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]


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

    1
    2
    3
    4
    5
    6
    7
    8
    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


    如果已存在具有其默认名称的限制:

    1
    2
    3
    4
    5
    6
    7
    -- 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;


    第一个放置约束

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

    1
    2
    3
    4
    5
    6
    7
    8
    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)

    第二个创建默认值

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


    尝试执行命令;

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


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

    1
    2
    3
    4
    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