Mat*_*ias 2648 sql sql-server sql-server-2005 sql-server-2000
如何将具有默认值的列添加到SQL Server 2000/SQL Server 2005中的现有表中?
小智 3349
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
可选的约束名称:
如果省略,CONSTRAINT D_SomeTable_SomeCol则SQL Server将
使用有趣的名称自动生成Default-Contraint,如:DF__SomeTa__SomeC__4FB7FEF6
可选的值声明:
本WITH VALUES当你的列可以为空时,才需要
并希望用于现有记录的默认值.
如果您的列是NOT NULL,则它将自动使用
所有现有记录的默认值,无论您是否指定WITH VALUES.
插件如何与默认约束一起使用:
如果将Record插入SomeTable并且不指定SomeCol's值,则它将默认为0.
如果您将Record 和 Specify SomeCol的值插入NULL(并且您的列允许空值),
则不会使用Default-Constraint NULL并将其作为Value插入.
笔记基于以下每个人的好评.
特别感谢:
@Yatrix,@ WalterStabosz,@ YahooSerious和@StackMan的评论.
dbu*_*ger 966
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
Run Code Online (Sandbox Code Playgroud)
包含DEFAULT会使用默认值填充现有行中的列,因此不会违反NOT NULL约束.
小智 225
添加可为空的列时,WITH VALUES将确保将特定的DEFAULT值应用于现有行:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
Run Code Online (Sandbox Code Playgroud)
ddc*_*660 131
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
Run Code Online (Sandbox Code Playgroud)
Eva*_*n V 121
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Run Code Online (Sandbox Code Playgroud)
jal*_*ert 97
请注意,您要添加的列具有NOT NULL约束,但没有DEFAULT约束(值).ALTER TABLE如果表中包含任何行,则该语句将失败.解决方案是NOT NULL从新列中删除约束,或为其提供DEFAULT约束.
ade*_*l41 96
最基本的版本只有两行
ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
Run Code Online (Sandbox Code Playgroud)
Jer*_*yOL 78
使用:
-- Add a column with a default DateTime
-- to capture when each record is added.
ALTER TABLE myTableName
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())
GO
Run Code Online (Sandbox Code Playgroud)
Gab*_* L. 73
如果要添加多个列,可以这样做,例如:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
Run Code Online (Sandbox Code Playgroud)
小智 55
使用:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Run Code Online (Sandbox Code Playgroud)
参考:ALTER TABLE(Transact-SQL)(MSDN)
小智 52
您可以通过以下方式使用T-SQL执行此操作.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Run Code Online (Sandbox Code Playgroud)
您还可以通过右键单击"设计"菜单中的表来使用SQL Server Management Studio,将默认值设置为table.
此外,如果要将相同的列(如果它不存在)添加到数据库中的所有表,则使用:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
Run Code Online (Sandbox Code Playgroud)
小智 50
在SQL Server 2008-R2中,我进入设计模式 - 在测试数据库中 - 使用设计器添加我的两列并使用GUI进行设置,然后臭名昭着Right-Click的选项" 生成更改脚本 "!
Bang up弹出一个小窗口,您猜对了,格式正确的保证工作更改脚本.点击简单按钮.
Cat*_*tto 50
要使用默认值将列添加到现有数据库表,我们可以使用:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
Run Code Online (Sandbox Code Playgroud)
下面是使用默认值将列添加到现有数据库表的另一种方法.
下面是一个更加彻底的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
Run Code Online (Sandbox Code Playgroud)
这两种方法是使用默认值将列添加到现有数据库表.
Chr*_*sto 48
或者,您可以添加默认值而无需明确命名约束:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
Run Code Online (Sandbox Code Playgroud)
如果在创建此约束时遇到现有默认约束的问题,则可以通过以下方式删除它们:
alter table [schema].[tablename] drop constraint [constraintname]
Run Code Online (Sandbox Code Playgroud)
Ton*_* L. 41
这也可以在SSMS GUI中完成.我在下面显示默认日期,但当然默认值可以是任何值.
(getdate())或abc或0任何值,如下图所示:Ben*_*tin 39
ALTER TABLE ADD ColumnName {Column_Type} Constraint
Run Code Online (Sandbox Code Playgroud)
MSDN文章ALTER TABLE(Transact-SQL)具有所有alter table语法.
小智 31
例:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
Run Code Online (Sandbox Code Playgroud)
Lax*_*xmi 21
首先创建一个名为student的表:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
Run Code Online (Sandbox Code Playgroud)
添加一列:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
Run Code Online (Sandbox Code Playgroud)
将创建该表,并使用默认值将列添加到现有表中.
Jak*_*ain 18
试试这个
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
Run Code Online (Sandbox Code Playgroud)
小智 18
SQL Server +更改表+添加列+默认值uniqueidentifier
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
Run Code Online (Sandbox Code Playgroud)
Jee*_*rti 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
Run Code Online (Sandbox Code Playgroud)
小智 17
有两种不同的方法可以解决这个问题。
两者都添加了默认值,但为此处的问题陈述添加了完全不同的含义。
让我们从创建一些示例数据开始。
CREATE TABLE ExistingTable (ID INT)
GO
INSERT INTO ExistingTable (ID)
VALUES (1), (2), (3)
GO
SELECT *
FROM ExistingTable
Run Code Online (Sandbox Code Playgroud)
ALTER TABLE ExistingTable
ADD ColWithDefault VARCHAR(10) DEFAULT 'Hi'
GO
Run Code Online (Sandbox Code Playgroud)
现在,由于我们在插入新记录时添加了默认列,因此'Hi'如果未提供该值,它将默认其值。
INSERT INTO ExistingTable(ID)
VALUES (4)
GO
Select * from ExistingTable
GO
Run Code Online (Sandbox Code Playgroud)
好吧,这解决了我们的问题,即具有默认值,但这里有一个问题。如果我们希望所有列都有默认值,而不仅仅是未来的插入,该怎么办?
为此,我们有方法2。
ALTER TABLE ExistingTable
ADD DefaultColWithVal VARCHAR(10) DEFAULT 'DefaultAll'
WITH VALUES
GO
Select * from ExistingTable
GO
Run Code Online (Sandbox Code Playgroud)
以下脚本将在每种可能的情况下添加一个具有默认值的新列。
小智 16
这有很多答案,但我觉得需要添加这个扩展方法.这看起来要长得多,但如果您将一个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
Run Code Online (Sandbox Code Playgroud)
这将做的是将列添加为可空字段并使用默认值,将所有字段更新为默认值(或者您可以指定更有意义的值),最后它将列更改为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
Run Code Online (Sandbox Code Playgroud)
wil*_*der 16
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Run Code Online (Sandbox Code Playgroud)
Chi*_*kar 14
向表中添加新列:
ALTER TABLE [table]
ADD Column1 Datatype
Run Code Online (Sandbox Code Playgroud)
例如,
ALTER TABLE [test]
ADD ID Int
Run Code Online (Sandbox Code Playgroud)
如果用户想要使其自动递增,则:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Run Code Online (Sandbox Code Playgroud)
Moh*_*gar 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
Run Code Online (Sandbox Code Playgroud)
小智 11
这适用于SQL Server:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
Run Code Online (Sandbox Code Playgroud)
例:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
Run Code Online (Sandbox Code Playgroud)
如果要添加约束,则:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Run Code Online (Sandbox Code Playgroud)
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
Run Code Online (Sandbox Code Playgroud)
从此查询中,您可以添加一个数据类型为整数的列,其默认值为0.
如果默认值为Null,则:
New ColumnSelect Type然后选中"允许空值"复选框Save完成!
好吧,我现在对我以前的答案进行了一些修改.我注意到没有提到的答案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
Run Code Online (Sandbox Code Playgroud)
这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]
Run Code Online (Sandbox Code Playgroud)
您可以使用此查询:
ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
Run Code Online (Sandbox Code Playgroud)
小智 8
请尝试以下查询:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Run Code Online (Sandbox Code Playgroud)
这将在表中添加一个新列。
SQL Server + Alter表+添加列+默认值uniqueidentifier ...
ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
Run Code Online (Sandbox Code Playgroud)
小智 6
步骤1。首先,您必须更改表并添加字段
alter table table_name add field field_name data_type
Run Code Online (Sandbox Code Playgroud)
步骤2建立预设
USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value';
Run Code Online (Sandbox Code Playgroud)
第三步,然后您必须执行此程序
exec sp_bindefault 'default_name' , 'schema_name.table_name.field_name'
Run Code Online (Sandbox Code Playgroud)
例子-
USE master;
GO
EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';
Run Code Online (Sandbox Code Playgroud)
小智 5
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
Run Code Online (Sandbox Code Playgroud)
--Adding New Column with Default Value
ALTER TABLE TABLENAME
ADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE)
Run Code Online (Sandbox Code Playgroud)
要么
--Adding CONSTRAINT And Set Default Value on Column
ALTER TABLE TABLENAME ADD CONSTRAINT [CONSTRAINT_Name] DEFAULT
(DEFAULT_VALUE) FOR [COLUMNNAME]
Run Code Online (Sandbox Code Playgroud)
ALTER TABLE <YOUR_TABLENAME>
ADD <YOUR_COLUMNNAME> <DATATYPE> <NULL|NOT NULL>
ADD CONSTRAINT <CONSTRAINT_NAME> ----OPTIONAL
DEFAULT <DEFAULT_VALUE>
Run Code Online (Sandbox Code Playgroud)
如果您没有给出约束名称,则 sql server 为此使用默认名称。
例子:-
ALTER TABLE TEMP_TABLENAME
ADD COLUMN1 NUMERIC(10,0) NOT NULL
ADD CONSTRAINT ABCDE ----OPTIONAL
DEFAULT (0)
Run Code Online (Sandbox Code Playgroud)