小智 3349

句法:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
Run Code Online (Sandbox Code Playgroud)

例:

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.
Run Code Online (Sandbox Code Playgroud)

笔记:

可选的约束名称:
如果省略,CONSTRAINT D_SomeTable_SomeCol则SQL Server将
    使用有趣的名称自动生成Default-Contraint,如:DF__SomeTa__SomeC__4FB7FEF6

可选的值声明:
WITH VALUES当你的列可以为空时,才需要
    并希望用于现有记录的默认值.
如果您的列是NOT NULL,则它将自动使用
    所有现有记录的默认值,无论您是否指定WITH VALUES.

插件如何与默认约束一起使用:
如果将Record插入SomeTable并且指定SomeCol's值,则它将默认为0.
如果您将Record Specify SomeCol的值插入NULL(并且您的列允许空值),
    则不会使用Default-Constraint NULL并将其作为Value插入.

笔记基于以下每个人的好评.
特别感谢:
    @Yatrix,@ WalterStabosz,@ YahooSerious和@StackMan的评论.

  • 请记住,如果列可以为空,则null将是用于现有行的值. (325认同)
  • 使用`WITH VALUES`来更新现有的可空行.请参阅[MSDN](http://msdn.microsoft.com/en-us/library/ms187742.aspx):"如果添加的列允许空值并且指定了"WITH VALUES",则默认值存储在新的列,添加到现有行." (48认同)
  • 我喜欢这个答案比dbugger好一点,因为它明确地命名了默认约束.仍使用dbugger的语法创建默认约束,但其名称是自动生成的.在编写DROP-CREATE脚本时,了解确切的名称非常方便. (40认同)
  • @Vertigo只有列是'NOT NULL'时才是真的.请尝试这样:`create table blah(一个int非null主键聚集); 插入blah值(1),(2); alter table blah add b int null constraint df_blah_b default(0); select*from blah;`你会看到列'b`的2个NULL值. (18认同)
  • @Thecrocodilehunter Nullable列意味着您可以为列值插入Null.如果它不是可为空的列,则必须插入该数据类型的某些值.因此,对于现有记录,将在其中插入Null并在新记录中插入默认值,除非另有说明.合理? (17认同)
  • @RichardCollette什么是可空列.如果我的数据类型是int或varchar,即使我指定了默认值,它也总是需要现有行的*null*值.这是否意味着默认值仅用于新记录? (2认同)

dbu*_*ger 966

ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
Run Code Online (Sandbox Code Playgroud)

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

  • 你会发现情况并非如此.否则将违反约束. (130认同)
  • 只是为了澄清 - 如果命令中省略了"NOT NULL",则现有行的值将不会更新并保持为NULL.如果命令中包含"NOT NULL",则将更新现有行的值以匹配默认值. (79认同)
  • 现有行中的列使用默认值填充.一点点的实证检验就可以证明这一点. (34认同)
  • 对于多列**ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT(1),col_2 int NULL** (15认同)
  • 该答案的问题是默认值仅对新记录有效.现有记录仍将具有NULL值. (13认同)
  • 请记住,如果使用此方法,则会在表中附加一个DEFAULT,以便将来省略新列的Insert语句将创建默认值而不是失败.如果您的目标是前进,您必须指定一个值,并且您不需要默认值,请确保删除您在成功添加列后创建的默认值. (4认同)
  • - 使ADD重新运行(例如,如果列已存在)... IF NOT EXISTS(SELECT*FROM sys.columns WHERE [name] = N'<InsertFieldName>'AND [object_id] = OBJECT_ID(N' <InsertTableName>'))BEGIN ALTER TABLE <InsertTableName> ADD <InsertFieldName> ... END (3认同)
  • 将约束命名为与让SQL自动命名相反,它将使您的架构更易于维护。下面的一些示例CONSTRAINT Constraint_name默认值为0,带有值 (2认同)

小智 225

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

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
Run Code Online (Sandbox Code Playgroud)

  • 这是一个关键点.很容易假设具有`DEFAULT`约束的列总是有一个值 - 即不是NULL,即使没有指定`NOT NULL`. (12认同)
  • @tkocmathla呃,我不是在讨论`BIT`数据类型,我在谈论这个特殊的`BIT`**列**.看看答案,该列被声明为"NOT NULL". (6认同)

ddc*_*660 131

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
Run Code Online (Sandbox Code Playgroud)

  • 如果表已有内容,则无效,因为在默认值约束之前创建了新的"不可为空"列 (7认同)

Eva*_*n V 121

ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Run Code Online (Sandbox Code Playgroud)

  • 这个添加null!之前必须不为null (13认同)
  • @baaroz,这适用于NOT NULL:ALTER TABLE MYTABLE添加MYNEWCOLUMN VARCHAR(200)NOT NULL默认'SNUGGLES' (5认同)

jal*_*ert 97

请注意,您要添加的列具有NOT NULL约束,但没有DEFAULT约束(值).ALTER TABLE如果表中包含任何行,则该语句将失败.解决方案是NOT NULL从新列中删除约束,或为其提供DEFAULT约束.

  • 关于它的任何*** SQL示例***吗? (2认同)

ade*_*l41 96

最基本的版本只有两行

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
Run Code Online (Sandbox Code Playgroud)


Jer*_*yOL 78

使用:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 
Run Code Online (Sandbox Code Playgroud)


Gab*_* L. 73

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

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


小智 55

使用:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Run Code Online (Sandbox Code Playgroud)

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


小智 52

您可以通过以下方式使用T-SQL执行此操作.

 ALTER TABLE {TABLENAME}
 ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
 CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Run Code Online (Sandbox Code Playgroud)

您还可以通过右键单击"设计"菜单中的表来使用SQL Server Management Studio,将默认值设置为table.

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

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
Run Code Online (Sandbox Code Playgroud)


小智 50

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

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


Cat*_*tto 50

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

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )
Run Code Online (Sandbox Code Playgroud)

下面是使用默认值将列添加到现有数据库表的另一种方法.

下面是一个更加彻底的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
Run Code Online (Sandbox Code Playgroud)

这两种方法是使用默认值将列添加到现有数据库表.


Chr*_*sto 48

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

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]
Run Code Online (Sandbox Code Playgroud)

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

alter table [schema].[tablename] drop constraint [constraintname]
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,为了便于维护,使用标准命名方案(例如“DF_Table_Column”)显式命名约束。否则,定位约束需要更多的工作。 (2认同)

Ton*_* L. 41

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

  1. 将您的表放在设计视图中(右键单击object explorer-> Design中的表)
  2. 向表中添加一列(如果已存在,则单击要更新的列)
  3. 在下面的列属性中,在默认值或绑定字段中输入(getdate())abc0任何值,如下图所示:

在此输入图像描述


Ben*_*tin 39

ALTER TABLE ADD ColumnName {Column_Type} Constraint
Run Code Online (Sandbox Code Playgroud)

MSDN文章ALTER TABLE(Transact-SQL)具有所有alter table语法.


小智 31

例:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
Run Code Online (Sandbox Code Playgroud)


小智 23

例:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
Run Code Online (Sandbox Code Playgroud)


Lax*_*xmi 21

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

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
Run Code Online (Sandbox Code Playgroud)

添加一列:

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

SELECT * 
FROM STUDENT
Run Code Online (Sandbox Code Playgroud)

将创建该表,并使用默认值将列添加到现有表中.

图片1


Jak*_*ain 18

试试这个

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
Run Code Online (Sandbox Code Playgroud)


小智 18

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

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
Run Code Online (Sandbox Code Playgroud)


Jee*_*rti 18

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
Run Code Online (Sandbox Code Playgroud)

  • 在尝试改变表格之前,我喜欢"NOT EXISTS"检查.很好的解决方案.关于它如何工作的一些额外评论会使它更有用. (3认同)

小智 17

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

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

创建样本数据

CREATE TABLE ExistingTable (ID INT)
GO
INSERT INTO ExistingTable (ID)
VALUES (1), (2), (3)
GO
SELECT *
FROM ExistingTable
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

ALTER TABLE ExistingTable
ADD ColWithDefault VARCHAR(10) DEFAULT 'Hi'
GO
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在,由于我们在插入新记录时添加了默认列,因此'Hi'如果未提供该值,它将默认其值。

INSERT INTO ExistingTable(ID)
VALUES (4)
GO
Select * from ExistingTable
GO
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

为此,我们有方法2。

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

ALTER TABLE ExistingTable
ADD DefaultColWithVal VARCHAR(10) DEFAULT 'DefaultAll'
WITH VALUES
GO
Select * from ExistingTable
GO
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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


小智 16

这有很多答案,但我觉得需要添加这个扩展方法.这看起来要长得多,但如果您将一个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
Run Code Online (Sandbox Code Playgroud)

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


wil*_*der 16

--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Run Code Online (Sandbox Code Playgroud)

  • 这并没有为多年前已有的答案增加任何价值. (5认同)

Chi*_*kar 14

向表中添加新列:

ALTER TABLE [table]
ADD Column1 Datatype
Run Code Online (Sandbox Code Playgroud)

例如,

ALTER TABLE [test]
ADD ID Int
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Run Code Online (Sandbox Code Playgroud)


Moh*_*gar 11

这可以通过以下代码完成.

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
Run Code Online (Sandbox Code Playgroud)


小智 11

这适用于SQL Server:

ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
Run Code Online (Sandbox Code Playgroud)

例:

ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
Run Code Online (Sandbox Code Playgroud)

如果要添加约束,则:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Run Code Online (Sandbox Code Playgroud)

  • 与几年前已经存在的答案相比,这没有任何价值。 (7认同)

San*_*mar 9

ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
Run Code Online (Sandbox Code Playgroud)

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


use*_*Bee 8

如果默认值为Null,则:

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

完成!


gdm*_*hon 8

好吧,我现在对我以前的答案进行了一些修改.我注意到没有提到的答案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
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)


Aru*_*n D 8

您可以使用此查询:

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
Run Code Online (Sandbox Code Playgroud)


小智 8

请尝试以下查询:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Run Code Online (Sandbox Code Playgroud)

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

  • 另一个用户对此问题的回答 (5认同)

Cha*_*kya 7

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

ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
Run Code Online (Sandbox Code Playgroud)


Moh*_*ani 7

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

然后添加一个默认值或绑定,类似于'1'表示字符串或1表示int.


小智 6

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

alter table table_name add field field_name data_type
Run Code Online (Sandbox Code Playgroud)

步骤2建立预设

USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value';
Run Code Online (Sandbox Code Playgroud)

第三步,然后您必须执行此程序

exec sp_bindefault 'default_name' , 'schema_name.table_name.field_name'
Run Code Online (Sandbox Code Playgroud)

例子-

USE master;
GO
EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';
Run Code Online (Sandbox Code Playgroud)


小智 5

ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
Run Code Online (Sandbox Code Playgroud)

  • 与多年前已经存在的答案相比,这并没有增加任何价值。 (8认同)

Erf*_*adi 5

--Adding New Column with Default Value
ALTER TABLE TABLENAME 
ADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE)
Run Code Online (Sandbox Code Playgroud)

要么

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

  • 这不会为现有答案增加任何价值。 (5认同)

Som*_*jia 5

ALTER TABLE <YOUR_TABLENAME>
ADD <YOUR_COLUMNNAME> <DATATYPE> <NULL|NOT NULL> 
ADD CONSTRAINT <CONSTRAINT_NAME>   ----OPTIONAL
DEFAULT <DEFAULT_VALUE>
Run Code Online (Sandbox Code Playgroud)

如果您没有给出约束名称,则 sql server 为此使用默认名称。

例子:-

ALTER TABLE TEMP_TABLENAME
ADD COLUMN1 NUMERIC(10,0) NOT NULL
ADD CONSTRAINT ABCDE   ----OPTIONAL
DEFAULT (0)
Run Code Online (Sandbox Code Playgroud)