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

Posted

技术标签:

【中文标题】将具有默认值的列添加到 SQL Server 中的现有表【英文标题】:Add a column with a default value to an existing table in SQL Server 【发布时间】:2010-09-10 15:53:46 【问题描述】:

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

【问题讨论】:

这个问题怎么有41个答案?仔细看,他们中的大多数人都在说同样的话。为什么这些不被删除?这个问题最多只需要 3 个答案。 ALTER TABLE SomeTable ADD SomeCol Bit NULL -- 或 NOT NULL。 CONSTRAINT D_SomeTable_SomeCol -- 如果省略默认约束名称,则会自动生成。 DEFAULT (0)--可选的默认约束。 WITH VALUES -- 如果 Column 为 Nullable 并且您想要现有记录的默认值,则添加。 @MichaelZ。 - 现在有 43 个答案..... 【参考方案1】:

有两种不同的方法来解决这个问题。 两者都添加了默认值,但在此处为问题陈述添加了完全不同的含义。

让我们从创建一些示例数据开始。

创建示例数据

CREATE TABLE ExistingTable (ID INT)
GO
INSERT INTO ExistingTable (ID)
VALUES (1), (2), (3)
GO
SELECT *
FROM ExistingTable

1.为以后的插入添加具有默认值的列

ALTER TABLE ExistingTable
ADD ColWithDefault VARCHAR(10) DEFAULT 'Hi'
GO

所以现在我们在插入新记录时添加了一个默认列,如果未提供值,它将默认其值为'Hi'

INSERT INTO ExistingTable(ID)
VALUES (4)
GO
Select * from ExistingTable
GO

这解决了我们使用默认值的问题,但这是一个问题。 如果我们想在所有列中都有默认值,而不仅仅是未来的插入呢??? 为此,我们有方法 2。

2.为所有插入添加具有默认值的列

ALTER TABLE ExistingTable
ADD DefaultColWithVal VARCHAR(10) DEFAULT 'DefaultAll'
WITH VALUES
GO
Select * from ExistingTable
GO

以下脚本将在每种可能的情况下添加一个具有默认值的新列。

希望它能为所提出的问题增加价值。 谢谢。

【讨论】:

【参考方案2】:

语法:

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

示例:

ALTER TABLE Admin_Master 
ADD Can_View_Password  BIT NULL 
CONSTRAINT DF_Admin_Master_Can_View_Password DEFAULT (1)
WITH VALUES 

【讨论】:

【参考方案3】:

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

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

【讨论】:

此功能在 18.1 版本的 SSMS 中存在缺陷。我在 nvarchar 上执行此操作,在 Default Value 或 Bindung 中输入 'vision' ,保存但它没有将我的字符串插入新实体。我回到对话框,发现字段中的条目被更改为 ('vision')【参考方案4】:
ALTER TABLE <YOUR_TABLENAME>
ADD <YOUR_COLUMNNAME> <DATATYPE> <NULL|NOT NULL> 
ADD CONSTRAINT <CONSTRAINT_NAME>   ----OPTIONAL
DEFAULT <DEFAULT_VALUE>

如果你没有给出约束名称,那么 sql server 使用默认名称。

示例:-

ALTER TABLE TEMP_TABLENAME
ADD COLUMN1 NUMERIC(10,0) NOT NULL
ADD CONSTRAINT ABCDE   ----OPTIONAL
DEFAULT (0)

【讨论】:

【参考方案5】:

OFFLINEONLINE 与如何在 NDB 集群表上执行 ALTER 表有关。 NDB Cluster 支持在 mysql NDB Cluster 7.3 及更高版本中使用 ALGORITHM=INPLACE 语法的在线 ALTER TABLE 操作。 NDB Cluster 还支持使用 ONLINE 和 OFFLINE 关键字的特定于 NDB 的旧语法。从 MySQL NDB Cluster 7.3 开始不推荐使用这些关键字;它们在 MySQL NDB Cluster 7.4 中继续受支持,但在 NDB Cluster 的未来版本中可能会被删除。

IGNORE 与 ALTER 语句将如何处理具有新添加约束 UNIQUE 的列中的重复值有关。如果未指定 IGNORE,则 ALTER 将失败并且不会被应用。如果指定了 IGNORE,则保留所有重复行的第一行,删除重置并应用 ALTER。

ALTER_SPECIFICATION 将是您要更改的内容。您正在添加、删除或修改什么列或索引,或者您在列上应用了哪些约束。

ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
       alter_specification [, alter_specification] ...

    alter_specification:
        ...
        ADD [COLUMN] (col_name column_definition,...)
        ...

Eg: ALTER TABLE table1 ADD COLUMN foo INT DEFAULT 0;

【讨论】:

【参考方案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 

【讨论】:

【参考方案7】:

右击表名,点击Design,点击最后一列名下,输入Column Name,Data Type,Allow Nulls。

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

【讨论】:

【参考方案8】:

ALTER 表 dataset.tablename 添加 column_current_ind 整数 DEFAULT 0

【讨论】:

【参考方案9】:

在 SQL Server 中,您可以使用以下模板:

ALTER TABLE tablename
ADD 
    columnname datatype DEFAULT default_value

例如,要将数据类型为 int 且默认值为 1 的新列 [Column1] 添加到现有表 [Table1] 中,您可以使用以下查询:

ALTER TABLE [Table1]
ADD 
    [Column1] INT DEFAULT 1

【讨论】:

【参考方案10】:

试试下面的查询:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

这将在表格中添加一个新列。

【讨论】:

【参考方案11】:

这是为 SQL Server 准备的:

ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES

例子:

ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES

如果你想添加约束,那么:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES

【讨论】:

【参考方案12】:

语法:

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 仅在您的列为 Nullable 时才需要 并且您想要用于现有记录的默认值。 如果您的列是NOT NULL,那么它将自动使用默认值 对于所有现有记录,无论您是否指定 WITH VALUES

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

注释是基于以下每个人的出色反馈。 特别感谢: @Yatrix、@WalterStabosz、@YahooSerious 和 @StackMan 发表评论。

【讨论】:

请记住,如果该列可以为空,那么 null 将是用于现有行的值。 @Thecrocodilehunter Nullable 列意味着您可以为列值插入 Null。如果它不是可为空的列,则必须插入该数据类型的一些值。因此,对于现有记录,将在其中插入 Null,而在新记录中,除非另有说明,否则将插入您的默认值。有意义吗? 我比 dbugger 更喜欢这个答案,因为它明确命名了默认约束。仍然使用 dbugger 的语法创建默认约束,除了它的名称是自动生成的。在编写 DROP-CREATE 脚本时知道确切的名称很方便。 使用WITH VALUES 更新现有的可为空行。请参阅MSDN:“如果添加的列允许空值并且指定了WITH VALUES,则默认值存储在新列中,添加到现有行中。” 当它回填默认值时,它会触发更新触发器和/或获取表锁吗?如果是这样,它们可以避免吗?【参考方案13】:
--Adding New Column with Default Value
ALTER TABLE TABLENAME 
ADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE)

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

【讨论】:

这不会对已经存在的答案增加任何价值。【参考方案14】:
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

【讨论】:

【参考方案15】:
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)

【讨论】:

这不会比多年前已有的答案增加任何价值。【参考方案16】:

要使用默认值向现有数据库表添加列,我们可以使用:

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

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

下面是一个更全面的 SQL 脚本,用于添加具有默认值的列,包括在添加列之前检查列是否存在,还检查约束并在存在约束时将其删除。该脚本还为约束命名,因此我们可以有一个很好的命名约定(我喜欢 DF_),如果不是,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

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

【讨论】:

【参考方案17】:

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

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

【讨论】:

【参考方案18】:

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

alter table table_name add field field_name data_type

步骤 2 创建默认值

USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value';

第 3 步然后你必须执行这个程序

exec sp_bindefault 'default_name' , 'schema_name.table_name.field_name'

示例 -

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

【讨论】:

【参考方案19】:

首先创建一个名为 student 的表:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

向其中添加一列:

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

SELECT * 
FROM STUDENT

创建表,并使用默认值向现有表添加一列。

【讨论】:

【参考方案20】:

这个有很多答案,但我觉得有必要添加这个扩展方法。这看起来要长很多,但如果您将 NOT NULL 字段添加到活动数据库中具有数百万行的表中,它会非常有用。

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

这将做的是将列添加为可空字段并使用默认值,将所有字段更新为默认值(或者您可以分配更有意义的值),最后它将将该列更改为 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

【讨论】:

【参考方案21】:

你可以使用这个查询:

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;

【讨论】:

【参考方案22】:

好吧,我现在对我之前的答案进行了一些修改。我注意到没有提到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 服务器查询生成器中看到错误。但如果不存在则第一次执行时不会报错。

ALTER TABLE TABLENAME
ADD COLUMNNAME TYPE NULL|NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT DEFAULT_VALUE
[WITH VALUES]

【讨论】:

【参考方案23】:

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

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

【讨论】:

【参考方案24】:

向表中添加新列:

ALTER TABLE [table]
ADD Column1 Datatype

例如,

ALTER TABLE [test]
ADD ID Int

如果用户想让它自动递增,那么:

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

【讨论】:

【参考方案25】:

或者,您可以添加默认值而无需显式命名约束:

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

如果您在创建此约束时遇到现有默认约束的问题,则可以通过以下方式删除它们:

alter table [schema].[tablename] drop constraint [constraintname]

【讨论】:

【参考方案26】:

用途:

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

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

【讨论】:

【参考方案27】:

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

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

【讨论】:

【参考方案28】:

您可以通过以下方式使用 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();''' ;

【讨论】:

【参考方案29】:

添加可为空的列时,WITH VALUES 将确保将特定的 DEFAULT 值应用于现有行:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

【讨论】:

【参考方案30】:

如果默认为 Null,则:

    在 SQL Server 中,打开目标表的树 右键单击“列”==> New Column 键入列名称Select Type,然后选中允许空值复选框 从菜单栏中,单击Save

完成!

【讨论】:

以上是关于将具有默认值的列添加到 SQL Server 中的现有表的主要内容,如果未能解决你的问题,请参考以下文章

如何在表中添加具有默认值的列

SQL-SQL Server-添加具有默认值和检查约束的列

如果源文件中不存在,ssis 添加具有默认值的列

检查 SQL SERVER 中的列是不是为 NULL

默认登录用户到 SQL Server 列

在 SQL Server 中添加具有两种数据类型的列