代码之家  ›  专栏  ›  技术社区  ›  Mathias

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

  •  2437
  • Mathias  · 技术社区  · 18 年前

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

    37 回复  |  直到 18 年前
        1
  •  3090
  •   MikeTeeVee ageektrapped    8 年前

    Syntax:

    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.
    

    笔记:

    可选约束名称:
    如果你不去 CONSTRAINT D_SomeTable_SomeCol 然后SQL Server将自动生成
    有一个有趣名字的默认约束,比如: DF__SomeTa__SomeC__4FB7FEF6

    可选WITH VALUES语句:
    这个 WITH VALUES 仅当列可以为空时才需要
    并且您希望对现有记录使用默认值。
    如果你的专栏是 NOT NULL ,然后它将自动使用默认值
    对于所有现有记录,无论您是否指定 带值 或者没有。

    插入如何使用默认约束:
    如果将记录插入 SomeTable 并且做 指定 SomeCol 的值,则默认为 0 .
    如果插入记录 指定 索默科 的价值 NULL (您的列允许空值),
    那么默认约束将 被使用和 无效的 将作为值插入。

    笔记是基于下面每个人的伟大反馈。
    特别感谢:
    @Yatrix,@Walterstabsz,@Yahooserior和@Stackman对他们的评论表示感谢。

        2
  •  902
  •   dbugger    10 年前
    ALTER TABLE Protocols
    ADD ProtocolTypeID int NOT NULL DEFAULT(1)
    GO
    

    包括 违约 填充列 现有的 具有默认值的行,因此不违反非空约束。

        3
  •  206
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    添加一个 空柱 , WITH VALUES 将确保将特定默认值应用于现有行:

    ALTER TABLE table
    ADD column BIT     -- Demonstration with NULL-able column added
    CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
    
        4
  •  121
  •   John Saunders    17 年前
    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
    
        5
  •  111
  •   Darren Griffith    13 年前
    ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
    
        6
  •  89
  •   jalbert    17 年前

    当您添加的列具有 NOT NULL 约束,但没有 DEFAULT 约束(值)。这个 ALTER TABLE 在这种情况下,如果表中有任何行,语句将失败。解决方案是移除 非空 来自新列的约束,或提供 违约 对它的约束。

        7
  •  86
  •   adeel41    14 年前

    只有两行的最基本版本

    ALTER TABLE MyTable
    ADD MyNewColumn INT NOT NULL DEFAULT 0
    
        8
  •  69
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    用途:

    -- Add a column with a default DateTime  
    -- to capture when each record is added.
    
    ALTER TABLE myTableName  
    ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
    GO 
    
        9
  •  62
  •   Gabriel L. Harish Padmalochanan    8 年前

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

    ALTER TABLE YourTable
        ADD Column1 INT NOT NULL DEFAULT 0,
            Column2 INT NOT NULL DEFAULT 1,
            Column3 VARCHAR(50) DEFAULT 'Hello'
    GO
    
        10
  •  46
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    用途:

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

    参考文献: ALTER TABLE (Transact-SQL) (MSDN)

        11
  •  43
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

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

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

    你也可以用 SQL Server Management Studio 也可以在“设计”菜单中的“表”上单击鼠标右键,将默认值设置为“表”。

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

     USE AdventureWorks;
     EXEC sp_msforeachtable
    'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
    
        12
  •  42
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

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

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

        13
  •  41
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

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

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

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

    alter table [schema].[tablename] drop constraint [constraintname]
    
        14
  •  40
  •   Catto    8 年前

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

    ALTER TABLE [dbo.table_name]
        ADD [Column_Name] BIT NOT NULL
    Default ( 0 )
    

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

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

    -------------------------------------------------------------------------
    -- 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
    

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

        15
  •  34
  •   Peter Mortensen Pieter Jan Bonestroo    13 年前
    ALTER TABLE ADD ColumnName {Column_Type} Constraint
    

    msdn文章 ALTER TABLE (Transact-SQL) 具有所有的alter表语法。

        16
  •  29
  •   Tony L. ccalboni    8 年前

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

    1. 将表置于设计视图中(右键单击对象中的表 资源管理器->设计)
    2. 向表中添加列(或单击要更新的列,如果 它已经存在)
    3. 在下面的列属性中,输入 (getdate()) abc 0 或者任何你想要的价值 默认值或绑定 如下图所示:

    enter image description here

        17
  •  27
  •   Peter Mortensen Pieter Jan Bonestroo    12 年前

    例子:

    ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
    
        18
  •  21
  •   shA.t Rami Jamleh    11 年前

    例子:

    ALTER TABLE tes 
    ADD ssd  NUMBER   DEFAULT '0';
    
        19
  •  17
  •   Sankar    9 年前

    首先创建名为student的表:

    CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
    

    向其中添加一列:

    ALTER TABLE STUDENT 
    ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
    
    SELECT * 
    FROM STUDENT
    

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

    Image 1

        20
  •  16
  •   Vivek S.    11 年前

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

    ALTER TABLE Product 
    ADD ReferenceID uniqueidentifier not null 
    default (cast(cast(0 as binary) as uniqueidentifier))
    
        21
  •  15
  •   Jakir Hossain    12 年前

    试试这个

    ALTER TABLE Product
    ADD ProductID INT NOT NULL DEFAULT(1)
    GO
    
        22
  •  14
  •   Bharath theorare Fischermaen    10 年前
    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
    
        23
  •  13
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

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

    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分钟内锁定一个更活跃的表,而且我经常会终止这个过程。这种方法每个部分通常只需要几秒钟,并导致最小的锁定。

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

    WHILE 1=1
    BEGIN
        UPDATE TOP (1000000) {schemaName}.{tableName}
            SET {columnName} = {DefaultValue}
            WHERE {columName} IS NULL
    
        IF @@ROWCOUNT < 1000000
            BREAK;
    END
    
        24
  •  12
  •   wild coder    8 年前
    --Adding Value with Default Value
    ALTER TABLE TestTable
    ADD ThirdCol INT NOT NULL DEFAULT(0)
    GO
    
        25
  •  10
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    向表中添加新列:

    ALTER TABLE [table]
    ADD Column1 Datatype
    

    例如,

    ALTER TABLE [test]
    ADD ID Int
    

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

    ALTER TABLE [test]
    ADD ID Int IDENTITY(1,1) NOT NULL
    
        26
  •  9
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

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

    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
    
        27
  •  8
  •   Sandeep Kumar    10 年前
    ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
    

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

        28
  •  8
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

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

    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查询生成器中看到错误。但如果它不存在,那么在第一次执行时就不会有错误。

    ALTER TABLE {TABLENAME}
    ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
    CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
    [WITH VALUES]
    
        29
  •  7
  •   d4mt usefulBee    9 年前

    如果默认值为空,则:

    1. 在SQL Server中,打开目标表的树
    2. 右键单击“Columns”==> New Column
    3. 键入列名, Select Type ,并选中“允许空值”复选框。
    4. 从菜单栏单击 Save

    完成!

        30
  •  6
  •   Chanukya Gordon Linoff    10 年前

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

    ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO