当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将具有默认值的列添加到SQLServer中的现有表》经验,为你挑选了36个好方法。

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



1> 小智..:

句法:

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

2> dbugger..:
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

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


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

3> 小智..:

添加空的列时,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`.
@tkocmathla呃,我不是在讨论`BIT`数据类型,我在谈论这个特殊的`BIT`**列**.看看答案,该列被声明为"NOT NULL".

4> ddc0660..:
ALTER TABLE  
ADD   NOT NULL
GO
ALTER TABLE 
ADD CONSTRAINT DEFAULT FOR GO


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

5> Evan V..:
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'


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

6> jalbert..:

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


关于它的任何*** SQL示例***吗?

7> adeel41..:

最基本的版本只有两行

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0



8> JerryOL..:

使用:

-- 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> Gabriel L...:

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

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



10> 小智..:

使用:

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

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



11> 小智..:

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



12> 小智..:

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

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



13> Catto..:

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

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

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



14> Christo..:

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

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

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

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



15> Tony L...:

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

    将您的表放在设计视图中(右键单击object explorer-> Design中的表)

    向表中添加一列(如果已存在,则单击要更新的列)

    在下面的列属性中,在默认值或绑定字段中输入(getdate())abc0任何值,如下图所示:

在此输入图像描述



16> Benjamin Aut..:
ALTER TABLE ADD ColumnName {Column_Type} Constraint

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



17> 小智..:

例:

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



18> 小智..:

例:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';



19> Laxmi..:

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

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

添加一列:

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

SELECT * 
FROM STUDENT

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

图片1



20> Jakir Hossai..:

试试这个

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



21> 小智..:

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

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



22> Jeevan Ghart..:
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"检查.很好的解决方案.关于它如何工作的一些额外评论会使它更有用.

23> 小智..:

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



24> wild coder..:
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO


这并没有为多年前已有的答案增加任何价值.

25> Chirag Thaka..:

向表中添加新列:

ALTER TABLE [table]
ADD Column1 Datatype

例如,

ALTER TABLE [test]
ADD ID Int

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

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



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



27> 小智..:

这适用于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


与几年前已经存在的答案相比,这没有任何价值。

28> Sandeep Kuma..:
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

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



29> usefulBee..:

如果默认值为Null,则:

    在SQL Server中,打开目标表的树

    右键单击"列"==> New Column

    键入列名称,Select Type然后选中"允许空值"复选框

    从菜单栏中单击 Save

完成!



30> gdmanandamoh..:

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



31> 小智..:

您可以使用此查询:

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;



32> 小智..:

请尝试以下查询:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

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


另一个用户对此问题的回答

33> Chanukya..:

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

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



34> Mohamad Shah..:

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

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



35> 小智..:

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

alter table table_name add field field_name data_type

步骤2建立预设

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

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

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

例子-

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



36> Erfan Mohamm..:
--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]


这不会为现有答案增加任何价值。
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有