如何将具有默认值的列添加到SQL Server 2000/SQL Server 2005中的现有表中?
Syntax:
1 2 3 4
| ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES |
例子:
1 2 3 4 5
| 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语句:
只有当列可以为空时,才需要WITH VALUES
&并且您希望对现有记录使用默认值。
如果您的列是NOT NULL,那么它将自动使用默认值
&对于所有现有记录,无论您是否指定WITH VALUES。
插入如何使用默认约束:
如果您在SomeTable中插入一条记录,并且没有指定SomeCol的值,那么它将默认为0。
如果插入一条记录并将SomeCol的值指定为NULL(并且您的列允许空值),
&则不使用默认约束,并插入NULL作为值。
笔记基于以下每个人的伟大反馈。
特别感谢:
&@yatrix、@walterstabsz、@yahooserior和@stackman发表了评论。
1 2 3
| ALTER TABLE Protocols
ADD ProtocolTypeID INT NOT NULL DEFAULT(1)
GO |
包含默认值将用默认值填充现有行中的列,因此不违反非空约束。
当添加一个可以为空的列时,WITH VALUES将确保对现有行应用特定的默认值:
1 2 3
| ALTER TABLE TABLE
ADD COLUMN BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES |
1 2 3 4 5 6
| 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 |
1
| ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES' |
当要添加的列有NOT NULL约束,但没有DEFAULT约束(值)时,请注意。在这种情况下,如果表中有任何行,那么ALTER TABLE语句将失败。解决方案是从新列中删除NOT NULL约束,或者为其提供DEFAULT约束。
只有两行的最基本版本
1 2
| ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0 |
用途:
1 2 3 4 5 6
| -- Add a column with a default DateTime
-- to capture when each record is added.
ALTER TABLE myTableName
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())
GO |
如果要添加多个列,可以这样做,例如:
1 2 3 4 5
| ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO |
用途:
1 2 3
| ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE} |
引用:alter table(Transact-SQL)(msdn)
您可以用下面的方法来处理T-SQL。
1 2 3
| ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE} |
也可以使用SQL Server Management Studio,方法是在"设计"菜单中右键单击"表",将默认值设置为"表"。
此外,如果要将同一列(如果不存在)添加到数据库中的所有表中,请使用:
1 2 3
| USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ; |
在SQL Server 2008-R2中,我进入设计模式(在测试数据库中),使用设计器添加我的两列,并使用GUI进行设置,然后臭名昭著的RIGHT CLICKABBD提供了"生成更改脚本"选项!
弹出一个小窗口,你猜对了,正确的格式保证了工作更改脚本。点击Easy按钮。
或者,可以添加默认值,而不必显式命名约束:
1
| ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname] |
如果在创建此约束时存在现有默认约束的问题,则可以通过以下方式删除这些约束:
1
| ALTER TABLE [schema].[tablename] DROP CONSTRAINT [constraintname] |
要将列添加到具有默认值的现有数据库表中,可以使用:
1 2 3
| ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
DEFAULT ( 0 ) |
下面是向现有数据库表中添加具有默认值的列的另一种方法。
下面是一个更加全面的SQL脚本,用于添加一个具有默认值的列,包括在添加前检查该列是否存在,还签入约束,如果存在约束,则删除约束。这个脚本还命名了约束,这样我们就可以有一个好的命名约定(我喜欢df_u),如果没有,SQL会给我们一个名为随机生成的数字的约束;所以也可以命名约束。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| -------------------------------------------------------------------------
-- 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 |
有两种方法可以将列添加到具有默认值的现有数据库表中。
1
| ALTER TABLE ADD ColumnName {Column_Type} CONSTRAINT |
msdn项目alter table(transact-sql)具有所有alter table语法。
这也可以在SSMS GUI中完成。我在下面显示了一个默认日期,但是默认值可以是任何值,当然。
将表置于设计视图中(右键单击对象中的表资源管理器->设计)
向表中添加列(或单击要更新的列,如果它已经存在)
在下面的列属性中,在默认值或绑定字段中输入(getdate())或abc或0或您想要的任何值,如下图所示:

例子:
1
| ALTER TABLE [Employees] ADD Seniority INT NOT NULL DEFAULT 0 GO |
例子:
1 2
| ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0'; |
首先创建名为student的表:
1
| CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL) |
向其中添加一列:
1 2 3 4 5
| ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT |
将创建表,并将列添加到具有默认值的现有表中。

SQL Server+alter table+add column+default value uniqueidentifier
1 2 3
| ALTER TABLE Product
ADD ReferenceID uniqueidentifier NOT NULL
DEFAULT (CAST(CAST(0 AS BINARY) AS uniqueidentifier)) |
试试这个
1 2 3
| ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO |
1 2 3 4 5 6 7
| 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 |
这有很多答案,但我觉得有必要添加这个扩展方法。这看起来要长得多,但如果要向活动数据库中有数百万行的表中添加非空字段,则非常有用。
1 2 3 4 5 6 7 8 9 10
| 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 |
这样做的目的是将列作为可空字段添加,并使用默认值将所有字段更新为默认值(或者您可以指定更有意义的值),最后将列更改为非空。
这样做的原因是,如果您更新一个大型表,并添加一个新的非空字段,它必须写入每一行,因此在添加列时将锁定整个表,然后写入所有值。
此方法将添加可为空的列,该列本身的操作速度更快,然后在设置非空状态之前填充数据。
我发现,在一个语句中执行整个操作将在4-8分钟内锁定一个更活跃的表,而且我经常会终止这个过程。这种方法每个部分通常只需要几秒钟,并导致最小的锁定。
此外,如果您有一个表在数十亿行的区域中,那么对更新进行批处理可能是值得的,比如:
1 2 3 4 5 6 7 8 9
| WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END |
1 2 3 4
| --Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO |
向表中添加新列:
1 2
| ALTER TABLE [TABLE]
ADD Column1 Datatype |
例如,
1 2
| ALTER TABLE [test]
ADD ID INT |
如果用户希望使其自动递增,则:
1 2
| ALTER TABLE [test]
ADD ID INT IDENTITY(1,1) NOT NULL |
这可以通过下面的代码来完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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 |
1
| ALTER TABLE tbl_table ADD int_column INT NOT NULL DEFAULT(0) |
从这个查询中,您可以添加一个数据类型为integer、默认值为0的列。
好吧,我现在对以前的答案做了一些修改。我注意到没有一个答案提到过IF NOT EXISTS。因此,我将提供一个新的解决方案,因为我在修改表时遇到了一些问题。
1 2 3 4 5 6
| 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查询生成器中看到错误。但如果它不存在,那么在第一次执行时就不会有错误。
1 2 3 4
| ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES] |
如果默认值为空,则:
在SQL Server中,打开目标表的树
右击"columns"==>New Column。
键入列名Select Type,然后选中"允许空值"复选框。
在菜单栏中,单击Save。
完成!
SQL Server+alter table+add column+default value uniqueidentifier…
1
| ALTER TABLE [TABLENAME] ADD MyNewColumn INT NOT NULL DEFAULT 0 GO |
您可以使用此查询:
1
| ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue; |
右键单击表,在最后一个列名下单击,然后输入列信息。
然后添加一个默认值或绑定,比如字符串的"1"或int的"1"。
这是针对SQL Server的:
1 2 3 4
| ALTER TABLE TableName
ADD ColumnName (TYPE) -- NULL OR NOT NULL
DEFAULT (DEFAULT VALUE)
WITH VALUES |
例子:
1 2 3
| ALTER TABLE Activities
ADD STATUS INT NOT NULL DEFAULT (0)
WITH VALUES |
如果要添加约束,则:
1 2 3 4
| ALTER TABLE Table_1
ADD row3 INT NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES |
步骤1。首先,您必须通过添加字段来更改表
1
| ALTER TABLE TABLE_NAME ADD FIELD field_name data_type |
步骤2创建默认值
1 2 3
| USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value'; |
步骤3,然后您必须执行此过程
1
| EXEC sp_bindefault 'default_name' , 'schema_name.table_name.field_name' |
示例-
1 2 3
| USE master;
GO
EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate'; |
1 2 3
| --Adding New Column with Default Value
ALTER TABLE TABLENAME
ADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE) |
或
1 2 3
| --Adding CONSTRAINT And Set Default Value on Column
ALTER TABLE TABLENAME ADD CONSTRAINT [CONSTRAINT_Name] DEFAULT
(DEFAULT_VALUE) FOR [COLUMNNAME] |
1
| ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0) |
尝试以下查询:
1 2
| ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue |
这将向表中添加一个新列。