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

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

3460030 次浏览
ALTER TABLE ADD ColumnName {Column_Type} Constraint

MSDN文章ALTER TABLE(Transact-SQL)具有所有的变更表语法。

ALTER TABLE ProtocolsADD ProtocolTypeID int NOT NULL DEFAULT(1)GO

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

语法:

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

示例:

ALTER TABLE SomeTableADD 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服务器将自动生成

可选的带值语句:
只有当您的列为空时才需要WITH VALUES
并且您希望将默认值用于现有记录。
如果您的列是NOT NULL,那么它将自动使用默认值
对于所有现有记录,无论您是否指定WITH VALUES

插入如何与默认约束一起工作:
如果您将记录插入SomeTable并执行不是指定SomeCol的值,那么它将默认为0
如果您插入记录SomeCol的值指定为NULL(并且您的列允许空值),
然后将使用默认约束不是,并将NULL作为值插入。

笔记是根据下面大家的反馈整理的。
特别鸣谢:
@Yatrix,@WalterStabosz,@YahooSerous和@StackMan发表评论。

ALTER TABLE <table name>ADD <new column name> <data type> NOT NULLGOALTER TABLE <table name>ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>GO

当你添加的列有NOT NULL约束,但没有DEFAULT约束(值)时要小心。如果表中有任何行,ALTER TABLE语句将失败。解决方案是从新列中删除NOT NULL约束,或者为其提供DEFAULT约束。

用途:

-- Add a column with a default DateTime-- to capture when each record is added.
ALTER TABLE myTableNameADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())GO

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

ALTER TABLE tableADD column BIT     -- Demonstration with NULL-able column addedCONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

您可以通过以下方式使用T-SQL。

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

您也可以通过右键单击设计菜单中的表格来使用SQL服务器管理工作室,将默认值设置为表格。

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

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

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

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

用途:

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

参考:ALTER TABLE(事务-SQL)(MSDN)

最基本的版本,只有两行

ALTER TABLE MyTableADD MyNewColumn INT NOT NULL DEFAULT 0

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

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

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

alter table [schema].[tablename] drop constraint [constraintname]
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

示例:

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

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

ALTER TABLE [dbo.table_name]ADD [Column_Name] BIT NOT NULLDefault ( 0 )

这是使用默认值向现有数据库表添加列的另一种方法。

下面是一个更彻底的SQL脚本,用于添加具有默认值的列,包括在添加它之前检查该列是否存在,还检查约束并删除它,如果有的话。这个脚本还命名了约束,所以我们可以有一个很好的命名约定(我喜欢DF_),如果没有SQL会给我们一个具有随机生成数字的名称的约束;所以能够命名约束也很好。

--------------------------------------------------------------------------- Drop COLUMN-- Name of Column: Column_EmployeeName-- Name of Table: table_Emplyee--------------------------------------------------------------------------IF EXISTS (SELECT 1FROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME = 'table_Emplyee'AND COLUMN_NAME = 'Column_EmployeeName')BEGIN
IF EXISTS ( SELECT 1FROM sys.default_constraintsWHERE 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_EmplyeeDROP COLUMN Column_EmployeeNamePRINT 'Column Column_EmployeeName in images table was dropped'END
---------------------------------------------------------------------------- ADD  COLUMN Column_EmployeeName IN table_Emplyee table--------------------------------------------------------------------------IF NOT EXISTS (SELECT 1FROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME = 'table_Emplyee'AND COLUMN_NAME = 'Column_EmployeeName')BEGIN----- ADD Column & ContraintALTER TABLE dbo.table_EmplyeeADD Column_EmployeeName BIT   NOT NULLCONSTRAINT [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 ProductADD ProductID INT NOT NULL DEFAULT(1)GO

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

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

示例:

ALTER TABLE tesADD ssd  NUMBER   DEFAULT '0';

SQL服务器+修改表+添加列+默认值unique标识符

ALTER TABLE ProductADD ReferenceID uniqueidentifier not nulldefault (cast(cast(0 as binary) as uniqueidentifier))

SQL服务器+更改表+添加列+默认值unique标识符…

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

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

  1. 将您的表放在设计视图中(右键单击对象中的表Explorer->Design)
  2. 向表中添加一列(或单击要更新的列,如果已经存在)
  3. 在下面的列属性中,在默认值或绑定字段中输入(getdate())'abc'0或任何您想要的值,如下图:

在此处输入图片描述

向表中添加新列:

ALTER TABLE [table]ADD Column1 Datatype

例如,

ALTER TABLE [test]ADD ID Int

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

ALTER TABLE [test]ADD ID Int IDENTITY(1,1) NOT NULL
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME')BEGINALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null defaultEND

如果默认值为Null,则:

  1. 在SQLServer中,打开目标表的树
  2. 右键单击”列" ==> New Column
  3. 键入列名称、Select Type并选中允许空值复选框
  4. 从菜单栏中,单击Save

成交!

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

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

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

CREATE TABLE TestTable(FirstCol INT NOT NULL)GO-------------------------------- Option 1-------------------------------- Adding New ColumnALTER TABLE TestTableADD SecondCol INTGO-- Updating it with DefaultUPDATE TestTableSET SecondCol = 0GO-- AlterALTER TABLE TestTableALTER COLUMN SecondCol INT NOT NULLGO

首先创建一个以学生命名的表:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

为其添加一列:

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

创建表并将一列添加到具有默认值的现有表中。

图像1

好吧,我现在对我之前的答案进行了一些修改。我注意到没有一个答案提到IF NOT EXISTS。所以我将提供一个新的解决方案,因为我在改变表格时遇到了一些问题。

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')BEGINALTER TABLE dbo.TaskSheet ADDIsBilledToClient bit NOT NULL DEFAULT ((1))ENDGO

这里TaskSheet是特定的表名,IsBilledToClient是您要插入的新列,1是默认值。这意味着在新列中现有行的值是多少,因此将在那里自动设置一个。但是,您可以根据需要更改列类型,就像我使用BIT一样,所以我输入了默认值1。

我建议使用上述系统,因为我遇到了一个问题。那么问题是什么?问题是,如果表中确实存在IsBilledToClient列,那么如果您只执行下面给出的代码部分,您将在SQL服务器查询生成器中看到错误。但如果它不存在,那么第一次执行时就不会有错误。

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;

这有很多答案,但我觉得有必要添加这个扩展方法。这看起来要长得多,但如果您要在活动数据库中具有数百万行的表中添加NOTNULL字段,它将非常有用。

ALTER TABLE {schemaName}.{tableName}ADD {columnName} {datatype} NULLCONSTRAINT {constraintName} DEFAULT {DefaultValue}
UPDATE {schemaName}.{tableName}SET {columnName} = {DefaultValue}WHERE {columName} IS NULL
ALTER TABLE {schemaName}.{tableName}ALTER COLUMN {columnName} {datatype} NOT NULL

这将做的是将列添加为可为空的字段并使用默认值,将所有字段更新为默认值(或者您可以分配更多有意义的值),最后将列更改为NOTNULL。

这样做的原因是,如果您更新一个大型表并添加一个新的not null字段,它必须写入每一行,并且在添加列然后写入所有值时将锁定整个表。

此方法将添加可空列,该列本身的运行速度要快得多,然后在设置非空状态之前填充数据。

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

此外,如果你有一个数十亿行的表,可能值得像这样批量更新:

WHILE 1=1BEGINUPDATE TOP (1000000) {schemaName}.{tableName}SET {columnName} = {DefaultValue}WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000BREAK;END

右键单击表名并单击设计,单击最后一个列名下并输入列名、数据类型、允许空值。

然后在页面底部设置一个默认值或绑定:类似于'1'的字符串或1的int。

第1步。首先,您必须使用添加字段来更改表

alter table table_name add field field_name data_type

步骤2创建默认值

USE data_base_name;GOCREATE DEFAULT default_name AS 'default_value';

第三步然后你必须执行这个程序

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

示例-

USE master;GOEXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';

这是SQL服务器:

ALTER TABLE TableNameADD ColumnName (type) -- NULL OR NOT NULLDEFAULT (default value)WITH VALUES

示例:

ALTER TABLE ActivitiesADD status int NOT NULL DEFAULT (0)WITH VALUES

如果您想添加约束,则:

ALTER TABLE Table_1ADD row3 int NOT NULLCONSTRAINT CONSTRAINT_NAME DEFAULT (0)WITH VALUES
--Adding Value with Default ValueALTER TABLE TestTableADD ThirdCol INT NOT NULL DEFAULT(0)GO
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
--Adding New Column with Default ValueALTER TABLE TABLENAMEADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE)

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

尝试以下查询:

ALTER TABLE MyTableADD MyNewColumn DataType DEFAULT DefaultValue

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

在SQL服务器中,您可以使用以下模板:

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

例如,要在现有表[Table1]中添加数据类型int且默认值=1的新列[Columbia n1],您可以使用以下查询:

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

修改表dataset.tablename添加column_current_ind整数DEFAULT 0

OFFLINEONLINE涉及如何在NDB集群表上执行ALTER表。NDB Cluster支持在线ALTER TABLE操作,使用MySQL NDB Cluster 7.3及更高版本中的ALGORITHM=INPLACE语法。NDB Cluster还支持特定于NDB的较旧语法,该语法使用ONLINE和OFFLINE关键字。从MySQL NDB Cluster 7.3开始,这些关键字已被弃用;它们在MySQL NDB Cluster 7.4中继续支持,但在NDB Cluster的未来版本中会被删除。

IGNORE与ALTER语句将如何处理新添加约束UniqUE的列中的重复值有关。如果未指定IGNORE,ALTER将失败且不会被应用。如果指定了IGNORE,则保留所有重复行的第一行,删除重置并应用ALTER。

ALTER_SPECIFICATION将是您正在更改的内容。您正在添加、删除或修改的列或索引,或者您在列上应用的约束。

ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_namealter_specification [, alter_specification] ...
alter_specification:...ADD [COLUMN] (col_name column_definition,...)...
Eg: ALTER TABLE table1 ADD COLUMN foo INT DEFAULT 0;
ALTER TABLE <YOUR_TABLENAME>ADD <YOUR_COLUMNNAME> <DATATYPE> <NULL|NOT NULL>ADD CONSTRAINT <CONSTRAINT_NAME>   ----OPTIONALDEFAULT <DEFAULT_VALUE>

如果您没有给出约束名称,那么sql服务器为此使用默认名称。

示例:-

ALTER TABLE TEMP_TABLENAMEADD COLUMN1 NUMERIC(10,0) NOT NULLADD CONSTRAINT ABCDE   ----OPTIONALDEFAULT (0)

SYNTAX:

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

示例:

ALTER TABLE Admin_MasterADD Can_View_Password  BIT NULLCONSTRAINT DF_Admin_Master_Can_View_Password DEFAULT (1)WITH VALUES

有两种方法可以解决这个问题。两者都添加了一个默认值,但在这里为问题语句添加了完全不同的含义。

让我们从创建一些示例数据开始。

创建示例数据

CREATE TABLE ExistingTable (ID INT)GOINSERT INTO ExistingTable (ID)VALUES (1), (2), (3)GOSELECT *FROM ExistingTable

在此处输入图片描述

1.为将来的插入添加具有默认值的列

ALTER TABLE ExistingTableADD ColWithDefault VARCHAR(10) DEFAULT 'Hi'GO

在此处输入图片描述

所以现在,当我们插入新记录时,我们添加了一个默认列,如果未提供值,它将默认它的值为'Hi'

INSERT INTO ExistingTable(ID)VALUES (4)GOSelect * from ExistingTableGO

在此处输入图片描述

这解决了我们有默认值的问题,但这里有一个问题。如果我们想在所有列中都有默认值,而不仅仅是未来的插入呢???方法2.

2.为所有插入添加具有默认值的列

ALTER TABLE ExistingTableADD DefaultColWithVal VARCHAR(10) DEFAULT 'DefaultAll'WITH VALUESGOSelect * from ExistingTableGO

在此处输入图片描述

以下脚本将在每个可能的场景中添加一个具有默认值的新列。

希望它能为提出的问题增加价值。谢谢!