用户甲.. 3111

句法:

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将
    使用有趣的名称自动生成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将是用于现有行的值. (307认同)
  • 使用`WITH VALUES`来更新现有的可空行.请参阅[MSDN](http://msdn.microsoft.com/en-us/library/ms187742.aspx):"如果添加的列允许空值并且指定了"WITH VALUES",则默认值存储在新的列,添加到现有行." (44认同)
  • 我喜欢这个答案比dbugger好一点,因为它明确地命名了默认约束.仍使用dbugger的语法创建默认约束,但其名称是自动生成的.在编写DROP-CREATE脚本时,了解确切的名称非常方便. (35认同)
  • @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值. (14认同)
  • @Thecrocodilehunter Nullable列意味着您可以为列值插入Null.如果它不是可为空的列,则必须插入该数据类型的某些值.因此,对于现有记录,将在其中插入Null并在新记录中插入默认值,除非另有说明.合理? (13认同)
  • @RichardCollette什么是可空列.如果我的数据类型是int或varchar,即使我指定了默认值,它也总是需要现有行的*null*值.这是否意味着默认值仅用于新记录? (2认同)
  • 你总结了4行,[MSDN](https://msdn.microsoft.com/en-us/library/ms190273.aspx)告诉我一百万.谢谢! (2认同)

dbugger.. 903

ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

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

  • 你会发现情况并非如此.否则将违反约束. (123认同)
  • 只是为了澄清 - 如果命令中省略了"NOT NULL",则现有行的值将不会更新并保持为NULL.如果命令中包含"NOT NULL",则将更新现有行的值以匹配默认值. (75认同)
  • 现有行中的列使用默认值填充.一点点的实证检验就可以证明这一点. (32认同)
  • 对于多列**ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT(1),col_2 int NULL** (13认同)
  • 该答案的问题是默认值仅对新记录有效.现有记录仍将具有NULL值. (11认同)
  • 请记住,如果使用此方法,则会在表中附加一个DEFAULT,以便将来省略新列的Insert语句将创建默认值而不是失败.如果您的目标是前进,您必须指定一个值,并且您不需要默认值,请确保删除您在成功添加列后创建的默认值. (3认同)
  • - 使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 (2认同)

用户甲.. 207

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

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

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

ddc0660.. 122

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

  • 如果表已有内容,则无效,因为在默认值约束之前创建了新的"不可为空"列 (7认同)
  • 在第一个"GO"之后,我的+1代表片段,它为现有列添加了一个约束. (2认同)

Evan V.. 111

ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

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

jalbert.. 89

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


adeel41.. 86

最基本的版本只有两行

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0


JerryOL.. 69

使用:

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

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 


Gabriel L... 62

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

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


用户甲.. 46

使用:

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

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


用户甲.. 43

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

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

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

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

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;


用户甲.. 42

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

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


Christo.. 41

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

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

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

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


Catto.. 40

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

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

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


Benjamin Aut.. 34

ALTER TABLE ADD ColumnName {Column_Type} Constraint

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


Tony L... 29

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

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

在此输入图像描述


用户甲.. 27

例:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO


用户甲.. 21

例:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';


Laxmi.. 17

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

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

添加一列:

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

SELECT * 
FROM STUDENT

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

图片1


用户甲.. 16

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

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))


Jakir Hossai.. 15

试试这个

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO


用户甲.. 14

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

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

用户甲.. 13

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


wild coder.. 12

--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

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

Chirag Thaka.. 10

向表中添加新列:

ALTER TABLE [table]
ADD Column1 Datatype

例如,

ALTER TABLE [test]
ADD ID Int

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

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


用户甲.. 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


Sandeep Kuma.. 8

ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

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


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

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]


usefulBee.. 7

如果默认值为Null,则:

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

完成!


Chanukya.. 6

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

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


用户甲.. 6

您可以使用此查询:

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;


用户甲.. 5

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

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


提问时间:

查看次数:

2526073 次

最近活跃:

1 年 前