将具有默认值的列添加到SQL Server中的现有表中

Add a column with a default value to an existing table in SQL Server

如何将具有默认值的列添加到SQL Server 2000/SQL Server 2005中的现有表中?


Syntax:

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

例子:

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

笔记:

可选约束名称:
如果不输入CONSTRAINT D_SomeTable_SomeCol,那么SQL Server将自动生成
&具有有趣名称的默认约束,如:DF__SomeTa__SomeC__4FB7FEF6

可选WITH VALUES语句:
只有当列可以为空时,才需要WITH VALUES
&并且您希望对现有记录使用默认值。
如果您的列是NOT NULL,那么它将自动使用默认值
&对于所有现有记录,无论您是否指定WITH VALUES

插入如何使用默认约束:
如果您在SomeTable中插入一条记录,并且没有指定SomeCol的值,那么它将默认为0
如果插入一条记录并将SomeCol的值指定为NULL(并且您的列允许空值),
&则不使用默认约束,并插入NULL作为值。

笔记基于以下每个人的伟大反馈。
特别感谢:
&@yatrix、@walterstabsz、@yahooserior和@stackman发表了评论。


1
2
3
ALTER TABLE Protocols
ADD ProtocolTypeID INT NOT NULL DEFAULT(1)
GO

包含默认值将用默认值填充现有行中的列,因此不违反非空约束。


当添加一个可以为空的列时,WITH VALUES将确保对现有行应用特定的默认值:

1
2
3
ALTER TABLE TABLE
ADD COLUMN BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES


1
2
3
4
5
6
ALTER TABLE <TABLE name>
ADD <NEW COLUMN name> <DATA type> NOT NULL
GO
ALTER TABLE <TABLE name>
ADD CONSTRAINT <CONSTRAINT name> DEFAULT <DEFAULT value> FOR <NEW COLUMN name>
GO


1
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'


当要添加的列有NOT NULL约束,但没有DEFAULT约束(值)时,请注意。在这种情况下,如果表中有任何行,那么ALTER TABLE语句将失败。解决方案是从新列中删除NOT NULL约束,或者为其提供DEFAULT约束。


只有两行的最基本版本

1
2
ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

用途:

1
2
3
4
5
6
-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO

如果要添加多个列,可以这样做,例如:

1
2
3
4
5
ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO


用途:

1
2
3
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}

引用:alter table(Transact-SQL)(msdn)


您可以用下面的方法来处理T-SQL。

1
2
3
 ALTER TABLE {TABLENAME}
 ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
 CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}

也可以使用SQL Server Management Studio,方法是在"设计"菜单中右键单击"表",将默认值设置为"表"。

此外,如果要将同一列(如果不存在)添加到数据库中的所有表中,请使用:

1
2
3
 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;

在SQL Server 2008-R2中,我进入设计模式(在测试数据库中),使用设计器添加我的两列,并使用GUI进行设置,然后臭名昭著的RIGHT CLICKABBD提供了"生成更改脚本"选项!

弹出一个小窗口,你猜对了,正确的格式保证了工作更改脚本。点击Easy按钮。


或者,可以添加默认值,而不必显式命名约束:

1
ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

如果在创建此约束时存在现有默认约束的问题,则可以通过以下方式删除这些约束:

1
ALTER TABLE [schema].[tablename] DROP CONSTRAINT [constraintname]


要将列添加到具有默认值的现有数据库表中,可以使用:

1
2
3
ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
DEFAULT ( 0 )

下面是向现有数据库表中添加具有默认值的列的另一种方法。

下面是一个更加全面的SQL脚本,用于添加一个具有默认值的列,包括在添加前检查该列是否存在,还签入约束,如果存在约束,则删除约束。这个脚本还命名了约束,这样我们就可以有一个好的命名约定(我喜欢df_u),如果没有,SQL会给我们一个名为随机生成的数字的约束;所以也可以命名约束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

有两种方法可以将列添加到具有默认值的现有数据库表中。


1
ALTER TABLE ADD ColumnName {Column_Type} CONSTRAINT

msdn项目alter table(transact-sql)具有所有alter table语法。


这也可以在SSMS GUI中完成。我在下面显示了一个默认日期,但是默认值可以是任何值,当然。

  • 将表置于设计视图中(右键单击对象中的表资源管理器->设计)
  • 向表中添加列(或单击要更新的列,如果它已经存在)
  • 在下面的列属性中,在默认值或绑定字段中输入(getdate())abc0或您想要的任何值,如下图所示:
  • enter image description here


    例子:

    1
    ALTER TABLE [Employees] ADD Seniority INT NOT NULL DEFAULT 0 GO

    例子:

    1
    2
    ALTER TABLE tes
    ADD ssd  NUMBER   DEFAULT '0';

    首先创建名为student的表:

    1
    CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

    向其中添加一列:

    1
    2
    3
    4
    5
    ALTER TABLE STUDENT
    ADD STUDENT_NAME INT NOT NULL DEFAULT(0)

    SELECT *
    FROM STUDENT

    将创建表,并将列添加到具有默认值的现有表中。

    Image 1


    SQL Server+alter table+add column+default value uniqueidentifier

    1
    2
    3
    ALTER TABLE Product
    ADD ReferenceID uniqueidentifier NOT NULL
    DEFAULT (CAST(CAST(0 AS BINARY) AS uniqueidentifier))

    试试这个

    1
    2
    3
    ALTER TABLE Product
    ADD ProductID INT NOT NULL DEFAULT(1)
    GO

    1
    2
    3
    4
    5
    6
    7
    IF NOT EXISTS (
        SELECT * FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
    )
    BEGIN
        ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) NOT NULL DEFAULT
    END


    这有很多答案,但我觉得有必要添加这个扩展方法。这看起来要长得多,但如果要向活动数据库中有数百万行的表中添加非空字段,则非常有用。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ALTER TABLE {schemaName}.{tableName}
        ADD {columnName} {datatype} NULL
        CONSTRAINT {constraintName} DEFAULT {DefaultValue}

    UPDATE {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    ALTER TABLE {schemaName}.{tableName}
        ALTER COLUMN {columnName} {datatype} NOT NULL

    这样做的目的是将列作为可空字段添加,并使用默认值将所有字段更新为默认值(或者您可以指定更有意义的值),最后将列更改为非空。

    这样做的原因是,如果您更新一个大型表,并添加一个新的非空字段,它必须写入每一行,因此在添加列时将锁定整个表,然后写入所有值。

    此方法将添加可为空的列,该列本身的操作速度更快,然后在设置非空状态之前填充数据。

    我发现,在一个语句中执行整个操作将在4-8分钟内锁定一个更活跃的表,而且我经常会终止这个过程。这种方法每个部分通常只需要几秒钟,并导致最小的锁定。

    此外,如果您有一个表在数十亿行的区域中,那么对更新进行批处理可能是值得的,比如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    WHILE 1=1
    BEGIN
        UPDATE TOP (1000000) {schemaName}.{tableName}
            SET {columnName} = {DefaultValue}
            WHERE {columName} IS NULL

        IF @@ROWCOUNT < 1000000
            BREAK;
    END

    1
    2
    3
    4
    --Adding Value with Default Value
    ALTER TABLE TestTable
    ADD ThirdCol INT NOT NULL DEFAULT(0)
    GO


    向表中添加新列:

    1
    2
    ALTER TABLE [TABLE]
    ADD Column1 Datatype

    例如,

    1
    2
    ALTER TABLE [test]
    ADD ID INT

    如果用户希望使其自动递增,则:

    1
    2
    ALTER TABLE [test]
    ADD ID INT IDENTITY(1,1) NOT NULL

    这可以通过下面的代码来完成。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE TABLE TestTable
        (FirstCol INT NOT NULL)
        GO
        ------------------------------
        -- Option 1
        ------------------------------
        -- Adding New Column
        ALTER TABLE TestTable
        ADD SecondCol INT
        GO
        -- Updating it with Default
        UPDATE TestTable
        SET SecondCol = 0
        GO
        -- Alter
        ALTER TABLE TestTable
        ALTER COLUMN SecondCol INT NOT NULL
        GO

    1
    ALTER TABLE tbl_table ADD int_column INT NOT NULL DEFAULT(0)

    从这个查询中,您可以添加一个数据类型为integer、默认值为0的列。


    好吧,我现在对以前的答案做了一些修改。我注意到没有一个答案提到过IF NOT EXISTS。因此,我将提供一个新的解决方案,因为我在修改表时遇到了一些问题。

    1
    2
    3
    4
    5
    6
    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME = 'TaskSheet' AND column_name = 'IsBilledToClient')
    BEGIN
    ALTER TABLE dbo.TaskSheet ADD
     IsBilledToClient bit NOT NULL DEFAULT ((1))
    END
    GO

    这里,TaskSheet是特定的表名,IsBilledToClient是要插入的新列,1是默认值。这意味着在新列中,现有行的值是什么,因此将在那里自动设置一个值。但是,您可以根据自己的需要更改列类型,就像我使用了BIT一样,所以我将默认值设置为1。

    我建议采用上述系统,因为我遇到了一个问题。那么问题是什么呢?问题是,如果表表中确实存在IsBilledToClient列,那么如果只执行下面给出的代码部分,则会在SQL Server查询生成器中看到错误。但如果它不存在,那么在第一次执行时就不会有错误。

    1
    2
    3
    4
    ALTER TABLE {TABLENAME}
    ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
    CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
    [WITH VALUES]

    如果默认值为空,则:

  • 在SQL Server中,打开目标表的树
  • 右击"columns"==>New Column
  • 键入列名Select Type,然后选中"允许空值"复选框。
  • 在菜单栏中,单击Save
  • 完成!


    SQL Server+alter table+add column+default value uniqueidentifier…

    1
    ALTER TABLE [TABLENAME] ADD MyNewColumn INT NOT NULL DEFAULT 0 GO

    您可以使用此查询:

    1
    ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;

    右键单击表,在最后一个列名下单击,然后输入列信息。

    然后添加一个默认值或绑定,比如字符串的"1"或int的"1"。


    这是针对SQL Server的:

    1
    2
    3
    4
    ALTER TABLE TableName
    ADD ColumnName (TYPE) -- NULL OR NOT NULL
    DEFAULT (DEFAULT VALUE)
    WITH VALUES

    例子:

    1
    2
    3
    ALTER TABLE Activities
    ADD STATUS INT NOT NULL DEFAULT (0)
    WITH VALUES

    如果要添加约束,则:

    1
    2
    3
    4
    ALTER TABLE Table_1
    ADD row3 INT NOT NULL
    CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
    WITH VALUES


    步骤1。首先,您必须通过添加字段来更改表

    1
    ALTER TABLE TABLE_NAME ADD FIELD field_name data_type

    步骤2创建默认值

    1
    2
    3
    USE data_base_name;
    GO
    CREATE DEFAULT default_name AS 'default_value';

    步骤3,然后您必须执行此过程

    1
    EXEC sp_bindefault 'default_name' , 'schema_name.table_name.field_name'

    示例-

    1
    2
    3
    USE master;
    GO
    EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';

    1
    2
    3
    --Adding New Column with Default Value
    ALTER TABLE TABLENAME
    ADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE)

    1
    2
    3
    --Adding CONSTRAINT And Set Default Value on Column
    ALTER TABLE TABLENAME ADD  CONSTRAINT [CONSTRAINT_Name]  DEFAULT
    (DEFAULT_VALUE) FOR [COLUMNNAME]


    1
    ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)


    尝试以下查询:

    1
    2
    ALTER TABLE MyTable
    ADD MyNewColumn DataType DEFAULT DefaultValue

    这将向表中添加一个新列。