如何将具有默认值的列添加到SQL Server 2000 / SQL Server 2005中的现有表格中?
答案 0 :(得分:3197)
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
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声明:
仅当您的列为Nullable时才需要WITH VALUES
并且您想要用于现有记录的默认值
如果您的列为NOT NULL
,则它会自动使用默认值
对于所有现有记录,无论您是否指定WITH VALUES
。
插件如何使用默认约束:
如果您将记录插入SomeTable
并执行 不 指定SomeCol
的值,则默认为0
。<登记/>
如果您插入记录 和 指定SomeCol
的值为NULL
(并且您的列允许空值),
然后默认约束将 不 ,并且NULL
将作为值插入。
备注基于以下每个人的好评
特别感谢:
@Yatrix,@ WalterStabosz,@ YahooSerious和@StackMan的评论。
答案 1 :(得分:933)
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
包含 DEFAULT 会使用默认值填充现有行中的列,因此不会违反NOT NULL约束。
答案 2 :(得分:220)
添加可空列时,WITH VALUES
将确保将特定的DEFAULT值应用于现有行:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
答案 3 :(得分:128)
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
答案 4 :(得分:117)
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
答案 5 :(得分:94)
请注意,要添加的列具有NOT NULL
约束,但没有DEFAULT
约束(值)。如果表中包含任何行,则ALTER TABLE
语句将失败。解决方案是从新列中删除NOT NULL
约束,或为其提供DEFAULT
约束。
答案 6 :(得分:92)
最基本的版本只有两行
ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
答案 7 :(得分:75)
使用:
-- Add a column with a default DateTime
-- to capture when each record is added.
ALTER TABLE myTableName
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())
GO
答案 8 :(得分:69)
如果要添加多个列,可以这样做,例如:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
答案 9 :(得分:52)
使用:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
参考:ALTER TABLE (Transact-SQL)(MSDN)
答案 10 :(得分:49)
您可以通过以下方式使用T-SQL执行此操作。
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
您还可以通过右键单击“设计”菜单中的表格来使用SQL Server Management Studio,将默认值设置为表格。
此外,如果要将相同的列(如果它不存在)添加到数据库中的所有表,则使用:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
答案 11 :(得分:48)
在SQL Server 2008-R2中,我进入设计模式 - 在测试数据库中 - 使用设计器添加我的两列并使用GUI进行设置,然后臭名昭着右键单击提供选项“ 生成更改脚本 ”!
Bang up弹出一个小窗口,您猜对了,正确格式化的保证工作更改脚本。按下简单按钮。
答案 12 :(得分:47)
或者,您可以添加默认值而无需明确命名约束:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
如果在创建此约束时遇到现有默认约束的问题,则可以通过以下方式删除它们:
alter table [schema].[tablename] drop constraint [constraintname]
答案 13 :(得分:47)
要使用默认值向现有数据库表添加列,我们可以使用:
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
这是使用默认值将列添加到现有数据库表的两种方法。
答案 14 :(得分:38)
ALTER TABLE ADD ColumnName {Column_Type} Constraint
MSDN文章 ALTER TABLE (Transact-SQL) 具有所有alter table语法。
答案 15 :(得分:35)
这也可以在SSMS GUI中完成。我在下面显示默认日期,但默认值可以是任何内容。
答案 16 :(得分:30)
示例:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
答案 17 :(得分:23)
示例:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
答案 18 :(得分:21)
首先创建一个名为student的表:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
向其中添加一列:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
创建表,并使用默认值将列添加到现有表中。
答案 19 :(得分:18)
SQL Server +更改表+添加列+默认值uniqueidentifier
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
答案 20 :(得分:18)
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
答案 21 :(得分:17)
试试这个
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
答案 22 :(得分:15)
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
答案 23 :(得分:15)
这有很多答案,但我觉得需要添加这个扩展方法。这看起来要长得多,但如果你在一个活动数据库中有数百万行的表中添加一个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
这样做是将列添加为可空字段并使用默认值,将所有字段更新为默认值(或者您可以指定更有意义的值),最后它会将列更改为NOT NULL。
原因是如果你更新一个大规模的表并添加一个新的非空字段,它必须写入每一行,因此它会在添加列时锁定整个表,然后写入所有值。
此方法将添加可自行操作的可为空的列,然后在设置非空状态之前填充数据。
我发现在一个语句中执行整个操作会锁定一个更活跃的表,持续4-8分钟,而且我经常杀死该进程。这个方法每个部分通常只需要几秒钟,并导致最小的锁定。
此外,如果您在数十亿行的区域中有一个表,那么可能值得批量处理更新:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
答案 24 :(得分:13)
向表中添加新列:
ALTER TABLE [table]
ADD Column1 Datatype
例如,
ALTER TABLE [test]
ADD ID Int
如果用户想要自动增加,则:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
答案 25 :(得分:11)
这可以通过以下代码完成。
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
答案 26 :(得分:9)
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
从此查询中,您可以添加一个数据类型为整数的列,其默认值为0。
答案 27 :(得分:8)
好吧,我现在对我以前的答案进行了一些修改。我注意到没有提到IF NOT EXISTS
的答案。所以我将提供一个新的解决方案,因为我遇到了一些改变表格的问题。
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“查询”构建器中看到错误。但如果它不存在那么第一次执行时就不会出错。
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
答案 28 :(得分:7)
您可以使用此查询:
ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
答案 29 :(得分:7)
这适用于SQL Server:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
示例:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
如果您想添加约束,那么:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
答案 30 :(得分:7)
如果默认值为Null,则:
New Column
Select Type
,然后选中允许空值复选框Save
完成!
答案 31 :(得分:7)
SQL Server +更改表+添加列+默认值uniqueidentifier ...
ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
答案 32 :(得分:6)
右键单击表格,在最后一列名称下单击,然后输入列信息。
然后添加默认值或绑定,例如&#39; 1&#39; for string或1 for int。
答案 33 :(得分:5)
步骤-1。首先,你必须改变表添加一个字段
alter table table_name add field field_name data_type
step-2 CREATE DEFAULT
USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value';
第3步然后你必须执行这个程序
exec sp_bindefault 'default_name' , 'schema_name.table_name.field_name'
示例 -
USE master;
GO
EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';
答案 34 :(得分:4)
--Adding CONSTRAINT And Set Default Value on Column
ALTER TABLE TABLENAME ADD CONSTRAINT [CONSTRAINT_Name] DEFAULT
(DEFAULT_VALUE) FOR [COLUMNNAME]
OR
if(rs.next())
答案 35 :(得分:3)
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
答案 36 :(得分:3)
ALTER TABLE <YOUR_TABLENAME>
ADD <YOUR_COLUMNNAME> <DATATYPE> <NULL|NOT NULL>
ADD CONSTRAINT <CONSTRAINT_NAME> ----OPTIONAL
DEFAULT <DEFAULT_VALUE>
如果不提供约束名称,则sql server为此使用默认名称。
示例:-
ALTER TABLE TEMP_TABLENAME
ADD COLUMN1 NUMERIC(10,0) NOT NULL
ADD CONSTRAINT ABCDE ----OPTIONAL
DEFAULT (0)
答案 37 :(得分:2)
尝试以下查询:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
这将在表中添加一个新列。
答案 38 :(得分:0)
在SQL Server中,您可以使用以下模板:
ALTER TABLE {tablename}
ADD
{columnname} {datatype} DEFAULT {default_value}
例如,要将具有默认值= 1的数据类型int
的新列[Column1]添加到现有表[Table1]中,可以使用以下查询:
ALTER TABLE [Table1]
ADD
[Column1] INT DEFAULT 1
答案 39 :(得分:0)
ALTER表的dataset.tablename 添加column_current_ind整数默认值0