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

时间:2008-09-18 12:30:05

标签: sql sql-server sql-server-2005 sql-server-2000

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

40 个答案:

答案 0 :(得分:3197)

语法:

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

插件如何使用默认约束:
如果您将记录插入SomeTable并执行 指定SomeCol的值,则默认为0。<登记/> 如果您插入记录 指定SomeCol的值为NULL(并且您的列允许空值), 然后默认约束将 ,并且NULL将作为值插入。

备注基于以下每个人的好评 特别感谢:
@Yatrix,@ WalterStabosz,@ YahooSerious和@StackMan的评论。

答案 1 :(得分:933)

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

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

答案 2 :(得分:220)

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

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

答案 3 :(得分:128)

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

答案 4 :(得分:117)

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

答案 5 :(得分:94)

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

答案 6 :(得分:92)

最基本的版本只有两行

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

答案 7 :(得分:75)

使用:

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

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

答案 8 :(得分:69)

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

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

答案 9 :(得分:52)

使用:

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

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

答案 10 :(得分:49)

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

答案 11 :(得分:48)

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

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

答案 12 :(得分:47)

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

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

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

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

答案 13 :(得分:47)

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

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 :(得分:38)

ALTER TABLE ADD ColumnName {Column_Type} Constraint

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

答案 15 :(得分:35)

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

  1. 将您的表放在设计视图中(右键单击对象中的表 Explorer的&GT;设计)
  2. 向表中添加一列(或者单击要更新的列,如果 它已经存在)
  3. 在下面的列属性中,在默认值或绑定字段中输入(getdate())abc0或您想要的任何值,如下图所示:
  4. enter image description here

答案 16 :(得分:30)

示例:

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

答案 17 :(得分:23)

示例:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';

答案 18 :(得分:21)

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

答案 19 :(得分:18)

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

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

答案 20 :(得分: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

答案 21 :(得分:17)

试试这个

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

答案 22 :(得分:15)

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

答案 23 :(得分:15)

这有很多答案,但我觉得需要添加这个扩展方法。这看起来要长得多,但如果你在一个活动数据库中有数百万行的表中添加一个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 :(得分:13)

向表中添加新列:

ALTER TABLE [table]
ADD Column1 Datatype

例如,

ALTER TABLE [test]
ADD ID Int

如果用户想要自动增加,则:

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

答案 25 :(得分: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

答案 26 :(得分:9)

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

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

答案 27 :(得分: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]

答案 28 :(得分:7)

您可以使用此查询:

ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;

答案 29 :(得分:7)

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

答案 30 :(得分:7)

如果默认值为Null,则:

  1. 在SQL Server中,打开目标表的树
  2. 右键单击&#34;列&#34; ==&GT; New Column
  3. 键入列名称Select Type,然后选中允许空值复选框
  4. 在菜单栏中,点击Save
  5. 完成!

答案 31 :(得分:7)

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

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

答案 32 :(得分:6)

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

然后添加默认值或绑定,例如&#39; 1&#39; for string或1 for int。

答案 33 :(得分:5)

步骤-1。首先,你必须改变表添加一个字段

alter table table_name add field field_name data_type

step-2 CREATE DEFAULT

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';

答案 34 :(得分:4)

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

OR

if(rs.next())

答案 35 :(得分:3)

ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)

答案 36 :(得分:3)

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)

答案 37 :(得分:2)

尝试以下查询:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

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

答案 38 :(得分:0)

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

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

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

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

答案 39 :(得分:0)

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