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

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

ALTER TABLE {TABLENAME} ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE} [WITH VALUES] 
 ALTER TABLE Protocols ADD ProtocolTypeID int NOT NULL DEFAULT(1) GO 

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

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

 ALTER TABLE table ADD column BIT -- Demonstration with NULL-able column added CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES 
 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 
 ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES' 

请注意,当您添加的列有NOT NULL约束,但没有DEFAULT约束(值)。 如果表中有任何行, ALTER TABLE语句在这种情况下将失败。 解决方法是从新列删除NOT NULL约束,或为其提供DEFAULT约束。

最基本的版本只有两行

 ALTER TABLE MyTable ADD MyNewColumn INT NOT NULL DEFAULT 0 

使用:

 -- Add a column with a default DateTime -- to capture when each record is added. ALTER TABLE myTableName ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate()) GO 

如果你想添加多列,你可以这样做,例如:

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

使用:

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

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

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

Bang uppopup一个小窗口,你猜对了,格式正确的保证工作改变脚本。 点击轻松button。

你可以用下面的方法用T-SQL来做这件事。

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

除此之外,您还可以通过右键单击“devise”菜单中的表来使用SQL Server Management Studio ,将默认值设置为表。

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

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

或者,您可以添加一个默认值,而不必明确命名约束:

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

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

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

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

 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 

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

 ALTER TABLE ADD ColumnName {Column_Type} Constraint 

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

例:

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

例:

 ALTER TABLE tes ADD ssd NUMBER DEFAULT '0'; 

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

  1. 把你的表放在devise视图中(右键单击对象浏览器 – >devise中的表格)
  2. 在表中添加一列(或者如果它已经存在,点击你想更新的列)
  3. 在下面的列属性中,在默认值或绑定字段中input(getdate())abc0或任何您需要的 ,如下图所示:

在这里输入图像说明

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

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

尝试这个

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

首先创build一个名称为student的表格:

 CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL) 

添加一列:

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

该表被创build并且列被添加到具有默认值的现有表中。

图片1

 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 

向表中添加一个新的列:

 ALTER TABLE [table] ADD Column1 Datatype 

例如,

 ALTER TABLE [test] ADD ID Int 

如果用户想要自动递增,那么:

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

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

 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 

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

这将做的是添加列作为一个可为空的字段和默认值,更新所有字段的默认值(或者你可以分配更有意义的值),最后它会改变列为非空。

原因是如果你更新大规模的表,并添加一个新的非空字段,它必须写入每一行,因此将locking整个表,因为它添加列,然后写所有的值。

这个方法会自动添加更快的可空列,然后在设置非空状态之前填充数据。

我发现在一个语句中完成整个事情会locking我们的一个更活跃的表格4-8分钟,而且我经常会杀死这个过程。 这个方法每个部分通常只需要几秒钟,并导致最小的locking。

此外,如果您在数十亿行的区域中有表格,则可能需要像下面这样批量更新:

 WHILE 1=1 BEGIN UPDATE TOP (1000000) {schemaName}.{tableName} SET {columnName} = {DefaultValue} WHERE {columName} IS NULL IF @@ROWCOUNT < 1000000 BREAK; END 
 ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0) 

从这个查询中,您可以添加一个数据types为integer的列,其默认值为0。

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

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

如果默认为空,则:

  1. 在SQL Server中,打开目标表的树
  2. 右键单击“列”==> New Column
  3. 键入列名称, Select Type ,并选中允许空checkbox
  4. 从菜单栏中,单击Save

完成!

那么,我现在有一些修改我以前的答案。 我注意到,没有提到的答案, IF NOT EXISTS 。 所以我会提供一个新的解决scheme,因为我遇到了一些改变表的问题。

 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是默认值。 这意味着在新的列中,现有行的值是什么,因此将在那里自动设置。 但是,你可以根据你所希望的改变列的types,比如我已经使用BIT ,所以我把默认值1。

我build议上面的系统,因为我遇到了问题。 那么问题是什么? 问题是,如果表中存在IsBilledToClient列,那么如果只执行下面给出的代码部分,则会在SQL Server“查询”构build器中看到一个错误。 但是,如果它不存在,那么第一次执行时就不会有错误。

 ALTER TABLE {TABLENAME} ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE} [WITH VALUES] 

你可以使用这个查询:

 ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;