将具有默认值的列添加到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

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


    推荐阅读

      linux添加的命令保存?

      linux添加的命令保存?,系统,时间,地址,名字,命令,文件,工作,名称,文件名,文

      linux添加用户的命令?

      linux添加用户的命令?,密码,系统,软件,联系方式,用户,新增,信息,管理人员,

      linux添加网口命令?

      linux添加网口命令?,网络,系统,工具,信息,最新,设备,地址,工作,密码,数据,lin

      linux命令添加挂载点?

      linux命令添加挂载点?,系统,信息,名称,情况,电脑,名字,设备,磁盘,分区,命令,l

      linux添加端口命令?

      linux添加端口命令?,服务,系统,工具,端口,位置,情况,软件,对外开放,命令,文

      linux命令添加ip?

      linux命令添加ip?,地址,系统,代码,网络,服务,密码,命令,百度,工具,设备,Linux

      linux命令中添加用户?

      linux命令中添加用户?,系统,密码,软件,用户,命令,信息,目录,用户名,账号,文

      linux添加分辨率命令?

      linux添加分辨率命令?,系统,情况,分辨率,状态,屏幕分辨率,屏幕,命令,桌面,

      linux系统命令添加?

      linux系统命令添加?,系统,密码,代码,简介,命令,实战,项目,工作,资料,基础,lin

      linux命令添加磁盘?

      linux命令添加磁盘?,系统,管理,信息,情况,电脑,数据,磁盘,命令,环境,工作,Lin

      添加网卡linux的命令?

      添加网卡linux的命令?,地址,系统,网络,信息,设备,电脑,网卡,发行,基本知识,

      linux新硬件添加命令?

      linux新硬件添加命令?,系统,设备,数据,业务,服务,盘前,信息,密码,名字,硬盘,

      添加网卡linux的命令?

      添加网卡linux的命令?,地址,系统,网络,信息,设备,电脑,网卡,发行,基本知识,

      linux新硬件添加命令?

      linux新硬件添加命令?,系统,设备,数据,业务,服务,盘前,信息,密码,名字,硬盘,

      linux命令添加一个组?

      linux命令添加一个组?,密码,系统,管理,代码,用户组,用户,命令,新增,文件,目

      linux添加快捷命令?

      linux添加快捷命令?,软件,名称,较大,第一,发行,命令,终端,快捷键,窗口,方法,

      linux命令添加文件?

      linux命令添加文件?,工作,简介,数据,系统,文件,命令,操作,文件名,内容,终端,l

      linux添加自启命令?

      linux添加自启命令?,服务,状态,密码,系统,脚本,第三,人员,标准,在线,实时,Pyt

      linux自启命令添加?

      linux自启命令添加?,服务,系统,工具,第三,第一,代码,密码,标准,项目,实时,lin

      linux命令怎么添加组?

      linux命令怎么添加组?,系统,密码,管理,用户,电脑,代码,新增,用户组,命令,账