Answers:
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将自动生成
一个带有有趣名称的Default-Contraint,例如:DF__SomeTa__SomeC__4FB7FEF6
可选的值声明:
本WITH VALUES
当你的列可以为空时,才需要
和想要的价值用于现有记录的默认值。
如果您的Column是NOT NULL
,则
无论您是否指定,它都会自动对所有现有记录使用默认值WITH VALUES
。
插入如何与默认约束一起使用:
如果将记录插入到SomeTable
并且不指定SomeCol
的值,则它将默认为0
。
如果您插入一个Record 并将其SomeCol
值指定为NULL
(并且您的列允许为空),
则将不使用Default-Constraint ,NULL
并将其作为Value插入。
注释基于以下每个人的好评。
特别感谢:
@ Yatrix,@ WalterStabosz,@ YahooSerious和@StackMan的评论。
NOT NULL
。请尝试以下操作:create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;
您将看到column的2个NULL值b
。
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
包含DEFAULT将使用默认值填充现有行中的列,因此不会违反NOT NULL约束。
添加可为null的列时,WITH VALUES
将确保将特定的DEFAULT值应用于现有行:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
约束的列将始终具有值-即使NOT NULL
未指定,也不能为NULL 。
BIT
数据类型,而是在谈论这个特殊的BIT
专栏。查看答案,该列声明为NOT NULL
。
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'
当您添加的列有NOT NULL
约束但没有DEFAULT
约束(值)时要当心。ALTER TABLE
如果表中有任何行,则该语句将失败。解决方案是NOT NULL
从新列中删除约束,或者为其提供DEFAULT
约束。
采用:
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();''' ;
另外,您可以添加默认值而不必显式命名约束:
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 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。
这样做的原因是,如果您更新了一个大型表并添加了一个新的非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 +更改表+添加列+默认值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
NOT EXISTS
在尝试更改表格之前,我喜欢检查。很好的解决方案。关于此工作原理的其他一些评论将使其变得更加有用。
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
将新列添加到表中:
ALTER TABLE [table]
ADD Column1 Datatype
例如,
ALTER TABLE [test]
ADD ID Int
如果用户想使其自动递增,则:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
这适用于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
这可以通过以下代码完成。
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]