如何在SQL Server 2000 / SQL Server 2005的现有表中添加具有默认值的列?
43 回答
句法:
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 语句:
仅
当WITH VALUES
您的列为 Nullable
并且您希望将默认值用于现有记录时才需要。
如果您的 Column 是NOT NULL
,那么无论您是否指定,它都会自动使用
所有现有记录的默认值WITH VALUES
。
插入如何与默认约束一起使用:
如果您将记录插入SomeTable
并且不指定SomeCol
的值,那么它将默认为0
。
如果您插入 Record并SpecifySomeCol
的值作为NULL
(并且您的列允许空值),
则默认约束将不会被使用,NULL
并将作为值插入。
笔记基于以下每个人的出色反馈。
特别感谢:
@Yatrix、@WalterStabosz、@YahooSerious 和 @StackMan 的评论。
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
包含DEFAULT会使用默认值填充现有行中的列,因此不会违反 NOT NULL 约束。
添加可为空的列时,WITH VALUES
将确保将特定的 DEFAULT 值应用于现有行:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
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
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
最基本的版本,只有两行
ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
当您添加的列有NOT NULL
约束但没有DEFAULT
约束(值)时要小心。在这种情况下,如果表中有任何行,该ALTER TABLE
语句将失败。NOT NULL
解决方案是从新列中删除约束,或为其提供DEFAULT
约束。
采用:
-- Add a column with a default DateTime
-- to capture when each record is added.
ALTER TABLE myTableName
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())
GO
如果你想添加多个列,你可以这样做,例如:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
采用:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
参考:ALTER TABLE (Transact-SQL) (MSDN)
要将列添加到具有默认值的现有数据库表,我们可以使用:
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
这是将列添加到具有默认值的现有数据库表的两种方法。
您可以通过以下方式使用 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();''' ;
在 SQL Server 2008-R2 中,我进入设计模式 - 在测试数据库中 - 并使用设计器添加我的两列并使用 GUI 进行设置,然后臭名昭著Right-Click的提供选项“生成更改脚本”!
弹出一个小窗口,您猜对了,正确格式的保证工作更改脚本。点击简单按钮。
或者,您可以添加默认值而无需显式命名约束:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
如果您在创建此约束时对现有默认约束有疑问,则可以通过以下方式删除它们:
alter table [schema].[tablename] drop constraint [constraintname]
ALTER TABLE ADD ColumnName {Column_Type} Constraint
MSDN 文章ALTER TABLE (Transact-SQL)包含所有的 alter table 语法。
例子:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
例子:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
这有很多答案,但我觉得有必要添加这个扩展方法。这似乎要长得多,但如果您将 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
试试这个
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL Server + Alter Table + 添加列 + 默认值 uniqueidentifier
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
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
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
这适用于 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
向表中添加新列:
ALTER TABLE [table]
ADD Column1 Datatype
例如,
ALTER TABLE [test]
ADD ID Int
如果用户想让它自动递增,那么:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
这可以通过下面的代码来完成。
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
尝试使用以下查询:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
这将在表格中添加一个新列。
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
从此查询中,您可以添加默认值为 0 的数据类型整数列。
好吧,我现在对我之前的答案进行了一些修改。我注意到没有提到任何答案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]
如果默认值为 Null,则:
- 在 SQL Server 中,打开目标表的树
- 右键单击“列”==>
New Column
- 键入列名称,
Select Type
然后选中允许空值复选框 - 在菜单栏中,单击
Save
完毕!
您可以使用此查询:
ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
右键单击表名并单击Design,单击最后一个列名下并输入 Column Name, Data Type, Allow Nulls。
然后在页面底部设置一个默认值或绑定:类似于 '1' 的字符串或 1 的 int。
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)
第1步。首先,您必须通过添加字段来更改表
alter table table_name add field field_name data_type
步骤 2 创建默认值
USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value';
step-3 然后你必须执行这个程序
exec sp_bindefault 'default_name' , 'schema_name.table_name.field_name'
例子 -
USE master;
GO
EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';
--Adding New Column with Default Value
ALTER TABLE TABLENAME
ADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE)
或者
--Adding CONSTRAINT And Set Default Value on Column
ALTER TABLE TABLENAME ADD CONSTRAINT [CONSTRAINT_Name] DEFAULT
(DEFAULT_VALUE) FOR [COLUMNNAME]
SQL Server + Alter Table + 添加列 + 默认值 uniqueidentifier...
ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
OFFLINE
并ONLINE
涉及如何在 NDB Cluster Tables 上执行 ALTER table。NDB Cluster 支持在 MySQL NDB Cluster 7.3 及更高版本中使用 ALGORITHM=INPLACE 语法的在线 ALTER TABLE 操作。NDB Cluster 还支持使用 ONLINE 和 OFFLINE 关键字的特定于 NDB 的旧语法。从 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_name
alter_specification [, alter_specification] ...
alter_specification:
...
ADD [COLUMN] (col_name column_definition,...)
...
Eg: ALTER TABLE table1 ADD COLUMN foo INT DEFAULT 0;
有两种不同的方法来解决这个问题。两者都添加了默认值,但在这里的问题陈述中添加了完全不同的含义。
让我们从创建一些示例数据开始。
创建示例数据
CREATE TABLE ExistingTable (ID INT)
GO
INSERT INTO ExistingTable (ID)
VALUES (1), (2), (3)
GO
SELECT *
FROM ExistingTable
1.为将来的插入添加具有默认值的列
ALTER TABLE ExistingTable
ADD ColWithDefault VARCHAR(10) DEFAULT 'Hi'
GO
所以现在我们在插入新记录时添加了一个默认列,'Hi'
如果没有提供值,它将默认它的值
INSERT INTO ExistingTable(ID)
VALUES (4)
GO
Select * from ExistingTable
GO
好吧,这解决了我们的问题以具有默认值,但这是一个问题。如果我们想在所有列中都有默认值,而不仅仅是未来的插入呢???为此,我们有方法 2。
2.为所有插入添加具有默认值的列
ALTER TABLE ExistingTable
ADD DefaultColWithVal VARCHAR(10) DEFAULT 'DefaultAll'
WITH VALUES
GO
Select * from ExistingTable
GO
以下脚本将在每种可能的情况下添加一个具有默认值的新列。
希望它为所提出的问题增加价值。谢谢。
在 SQL Server 中,您可以使用以下模板:
ALTER TABLE {tablename}
ADD
{columnname} {datatype} DEFAULT {default_value}
例如,要将int
默认值 = 1 的数据类型的新列 [Column1] 添加到现有表 [Table1] 中,可以使用以下查询:
ALTER TABLE [Table1]
ADD
[Column1] INT DEFAULT 1
ALTER 表 dataset.tablename ADD column_current_ind 整数 DEFAULT 0
句法:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
例子:
ALTER TABLE Admin_Master
ADD Can_View_Password BIT NULL
CONSTRAINT DF_Admin_Master_Can_View_Password DEFAULT (1)
WITH VALUES