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

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

提问人:Mathias 提问时间:9/18/2008 最后编辑:John SmithMathias 更新时间:11/6/2023 访问量:3681126

问:

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

sql sql-server sql-server-2000

评论

0赞 Himanshu 11/7/2023
相关(如果要添加带有名称的默认约束)stackoverflow.com/q/3770015/1369235

答:

48赞 Benjamin Autin 9/18/2008 #1
ALTER TABLE ADD ColumnName {Column_Type} Constraint

MSDN 文章 ALTER TABLE (Transact-SQL) 包含所有 alter table 语法。

1197赞 dbugger 9/18/2008 #2
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

包含 DEFAULT 会使用默认值填充现有行中的列,因此不会违反 NOT NULL 约束。

评论

102赞 Stack Man 8/15/2012
澄清一下 - 如果命令中省略了“NOT NULL”,则现有行的值将不会更新,并且将保持 NULL。如果命令中包含“NOT NULL”,则现有行的值将更新为与默认值匹配。
0赞 VolkanCetinkaya 8/12/2022
有关更详细的内容;stackoverflow.com/questions/2523676/......
4072赞 James Boother 9/18/2008 #3

语法:

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.

笔记:

可选约束名称:
如果省略,则 SQL Server 将自动生成
一个 Default-Contraint,其名称如下:
CONSTRAINT D_SomeTable_SomeColDF__SomeTa__SomeC__4FB7FEF6

可选的 With-Values 语句:
仅当列可
为 Null 且您希望将默认值用于现有记录时才需要。
如果您的列是 ,则无论您是否指定,它都将自动
使用所有现有记录的默认值。
WITH VALUESNOT NULLWITH VALUES

插入如何使用 Default-Constraint:
如果将 Record 插入其中且指定 的值,则它将默认为 。
如果插入 Record 并将 Specify 的值指定为 (并且您的列允许 null),
不会使用 Default-Constraint,而是作为 Value 插入。
SomeTableSomeCol0SomeColNULLNULL

笔记基于下面每个人的精彩反馈。
特别感谢:
@Yatrix、@WalterStabosz、@YahooSerious 和 @StackMan 的评论。

评论

360赞 Richard Collette 1/31/2012
请记住,如果该列可为 null,则 null 将是用于现有行的值。
20赞 Yatrix 3/1/2012
@Thecrocodilehunter Nullable 列意味着您可以为列值插入 Null。如果它不是可以为 null 的列,则必须插入该数据类型的某个值。因此,对于现有记录,将在其中插入 Null,在新记录中,除非另有指定,否则将插入默认值。有意义?
46赞 Walter Stabosz 3/23/2012
我比 dbugger 的答案更喜欢这个答案,因为它明确命名了默认约束。默认约束仍使用 dbugger 的语法创建,但其名称是自动生成的。在编写 DROP-CREATE 脚本时,知道确切的名称非常方便。
52赞 Yahoo Serious 7/28/2014
用于更新现有的可为 null 的行。请参阅 MSDN:“如果添加的列允许 null 值并已指定,则默认值将存储在添加到现有行的新列中。WITH VALUESWITH VALUES
0赞 xr280xr 12/3/2021
当它回填默认值时,它会触发更新触发器和/或获取表锁吗?如果是这样,它们可以避免吗?
159赞 ddc0660 9/18/2008 #4
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
109赞 jalbert 9/25/2008 #5

当要添加的列具有约束但没有约束(值)时,请注意。在这种情况下,如果表中包含任何行,则该语句将失败。解决方案是从新列中删除约束,或为其提供约束。NOT NULLDEFAULTALTER TABLENOT NULLDEFAULT

103赞 JerryOL 12/10/2010 #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 
285赞 phunk_munkie 4/13/2011 #7

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

ALTER TABLE table_name
ADD column_name BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
59赞 gngolakia 11/27/2011 #8

可以通过以下方式使用 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();''' ;
58赞 Jack 12/1/2011 #9

在 SQL Server 2008-R2 中,我进入设计模式 - 在测试数据库中 - 并使用设计器添加我的两列并使用 GUI 进行设置,然后臭名昭著的给出了“生成更改脚本”选项!Right-Click

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

63赞 giá vàng 12/27/2011 #10

用:

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

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

125赞 adeel41 5/25/2012 #11

最基本的版本,只有两行

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
57赞 Christo 6/1/2012 #12

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

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

如果在创建此约束时对现有默认约束有疑问,则可以通过以下方式将其删除:

alter table [schema].[tablename] drop constraint [constraintname]
150赞 Evan V 8/5/2012 #13
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
37赞 andy 3/5/2014 #14

例:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
65赞 Catto 6/21/2014 #15

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

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

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

22赞 Jakir Hossain 9/1/2014 #16

试试这个

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
97赞 Gabriel L. 10/15/2014 #17

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

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO
27赞 Mohit Tamrakar 11/25/2014 #18

例:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
22赞 Naveen Desosha 6/15/2015 #19

SQL Server + 更改表 + 添加列 + 默认值 uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
5赞 Chanukya 12/7/2015 #20

SQL Server + 更改表 + 添加列 + 默认值 uniqueidentifier...

ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
57赞 Tony L. 12/11/2015 #21

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

  1. 将表格置于设计视图中(右键单击对象中的表格) explorer->设计)
  2. 向表格中添加一列(或单击要更新的列,如果 它已经存在)
  3. 在下面的“列属性”中,在“默认值”或“绑定”字段中输入所需的任何值,如下所示:(getdate())'abc'0

enter image description here

评论

0赞 d00d 11/25/2021
此功能在 SSMS 的 18.1 版本中存在问题。我在 nvarchar 上这样做了,在默认值或 Bindung 中输入了“vision”,保存了,但它没有将我的字符串插入到新实体中。我回到对话框,发现字段中的条目被更改为('vision')
18赞 Chiragkumar Thakar 12/22/2015 #22

向表中添加新列:

ALTER TABLE [table]
ADD Column1 Datatype

例如

ALTER TABLE [test]
ADD ID Int

如果用户想要使其自动递增,则:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
20赞 Jeevan Gharti 4/26/2016 #23
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
8赞 usefulBee 5/9/2016 #24

如果默认值为 Null,则:

  1. 在 SQL Server 中,打开目标表的树
  2. 右键单击“列”==>New Column
  3. 键入列 Name,然后选中 Allow Null 复选框Select Type
  4. 在菜单栏中,单击Save

做!

10赞 Sandeep Kumar 5/24/2016 #25
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

在此查询中,可以添加数据类型为整数的列,默认值为 0。

13赞 Mohit Dagar 9/9/2016 #26

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

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
26赞 Laxmi 10/20/2016 #27

首先创建一个名为 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

11赞 Ananda G 3/9/2017 #28

好吧,我现在对我之前的答案进行了一些修改。我注意到没有提到任何答案。因此,我将提供一个新的解决方案,因为我在更改表格时遇到了一些问题。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

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

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

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
8赞 Arun D 3/15/2017 #29

您可以使用以下查询:

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
24赞 Ste Bov 5/5/2017 #30

这有很多答案,但我觉得有必要添加这个扩展方法。这似乎要长得多,但如果将 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

这将做的是将列添加为可为 null 的字段,并使用默认值将所有字段更新为默认值(或者您可以分配更有意义的值),最后它会将列更改为 NOT NULL。

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

此方法将添加可为 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
10赞 Mohammad Reza Shahrestani 5/9/2017 #31

右键单击表名称,然后单击“设计”,在最后一列名称下单击,然后输入列名称”、“数据类型”、“允许空值”。

然后在页面底部设置默认值或绑定:例如“1”表示字符串或 1 表示 int。

6赞 raju chowrsiya 10/4/2017 #32

步骤-1。首先,您必须使用 ADD A FIELD 更改表

alter table table_name add field field_name data_type

step-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';
25赞 Akhil Singh 2/5/2018 #33

这适用于 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
21赞 wild coder 2/8/2018 #34
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
4赞 Krishan Dutt Sharma 2/13/2018 #35
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
6赞 Erfan Mohammadi 4/15/2018 #36
--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]
15赞 Anshul Dubey 8/28/2018 #37

尝试以下查询:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

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

4赞 Samay 11/19/2019 #38

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

ALTER TABLE {tablename}
ADD 
    {columnname} {datatype} DEFAULT {default_value}

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

ALTER TABLE [Table1]
ADD 
    [Column1] INT DEFAULT 1
2赞 wish 12/4/2019 #39

ALTER 表 dataset.tablename 添加column_current_ind整数默认值为 0

4赞 jithu thomas 5/9/2020 #40

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

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;
11赞 Somendra Kanaujia 6/13/2020 #41
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)
0赞 Priyanka Vadhwani 10/26/2021 #42

语法:

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 
17赞 ishant kaushik 11/18/2021 #43

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

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

创建示例数据

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

enter image description here

1.添加具有默认值的列以供将来插入

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

enter image description here

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

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

enter image description here

好吧,这解决了我们具有默认值的问题,但这里有一个问题。 如果我们希望在所有列中都有默认值,而不仅仅是将来的插入,该怎么办??? 为此,我们有方法2。

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

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

enter image description here

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

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

-1赞 user20178351 3/3/2023 #44

对于 Oracle Toad 用户:

 ALTER TABLE YOUR_SCHEMA.YOUR_TABLENAME ADD YOUR_COLUMNNAME VARCHAR2(100 CHAR);
COOMMIT;

评论

0赞 KnechtRootrecht 8/21/2023
那些“蟾蜍使用者”可能会问。这个 coomit 是什么以及为什么他们在文档中找不到它。
1赞 RAHUL RAJ 11/6/2023 #45

alter table TBL add col 数据类型 default null after col2 ;

例如:- alter table vendor add updatedBy varchar(255) default not null after isActive;