将具有默认值的列添加到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,但默认值可以是任何,当然。
- 把你的表放在devise视图中(右键单击对象浏览器 – >devise中的表格)
- 在表中添加一列(或者如果它已经存在,点击你想更新的列)
- 在下面的列属性中,在默认值或绑定字段中input
(getdate())
或abc
或0
或任何您需要的值 ,如下图所示:
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并且列被添加到具有默认值的现有表中。
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
如果默认为空,则:
- 在SQL Server中,打开目标表的树
- 右键单击“列”==>
New Column
- 键入列名称,
Select Type
,并选中允许空checkbox - 从菜单栏中,单击
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;