Add a column with a default value to an existing table in SQL Server
如何将具有默认值的列添加到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. |
笔记:
可选约束名称:
如果不输入
&具有有趣名称的默认约束,如:
可选WITH VALUES语句:
只有当列可以为空时,才需要
&并且您希望对现有记录使用默认值。
如果您的列是
&对于所有现有记录,无论您是否指定
插入如何使用默认约束:
如果您在
如果插入一条记录并将
&则不使用默认约束,并插入
笔记基于以下每个人的伟大反馈。
特别感谢:
&@yatrix、@walterstabsz、@yahooserior和@stackman发表了评论。
1 2 3 | ALTER TABLE Protocols ADD ProtocolTypeID INT NOT NULL DEFAULT(1) GO |
包含默认值将用默认值填充现有行中的列,因此不违反非空约束。
当添加一个可以为空的列时,
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' |
当要添加的列有
只有两行的最基本版本
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中完成。我在下面显示了一个默认日期,但是默认值可以是任何值,当然。
例子:
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的列。
好吧,我现在对以前的答案做了一些修改。我注意到没有一个答案提到过
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 |
这里,
我建议采用上述系统,因为我遇到了一个问题。那么问题是什么呢?问题是,如果表表中确实存在
1 2 3 4 | ALTER TABLE {TABLENAME} ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE} [WITH VALUES] |
如果默认值为空,则:
完成!
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 |
这将向表中添加一个新列。