更改列默认值
Posted
技术标签:
【中文标题】更改列默认值【英文标题】:Alter column default value 【发布时间】:2014-11-06 20:54:56 【问题描述】:我知道您可以更改现有列的默认值,例如 this:
ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
但根据this 我的查询应该可以工作:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL
CONSTRAINT DF_Constraint DEFAULT GetDate()
所以在这里我试图使我的列 Not Null 并设置默认值。但是在 CONSTRAINT 附近出现 Inoorect 语法错误。我错过了什么吗?
【问题讨论】:
我认为你需要ADD CONSTRAINT
,就像你的第一个例子一样。
【参考方案1】:
在 SQL Server 中没有直接的方法来改变列的默认值,但是下面的参数化脚本可以做到这一点:
DECLARE @table NVARCHAR(100);
DECLARE @column NVARCHAR(100);
DECLARE @newDefault NVARCHAR(100);
SET @table = N'TableName';
SET @column = N'ColumnName';
SET @newDefault = N'0';
IF EXISTS (
SELECT name
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID(@table)
AND parent_column_id = COLUMNPROPERTY(OBJECT_ID(@table), @column, 'ColumnId')
)
BEGIN
DECLARE @constraintName AS NVARCHAR(200);
DECLARE @constraintQuery AS NVARCHAR(2000);
SELECT @constraintName = name
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID(@table)
AND parent_column_id = COLUMNPROPERTY(OBJECT_ID(@table), @column, 'ColumnId');
SET @constraintQuery = N'ALTER TABLE ' + @table + N' DROP CONSTRAINT '
+ @constraintName + N'; ALTER TABLE ' + @table + N' ADD CONSTRAINT '
+ @constraintName + N' DEFAULT ' + @newDefault + N' FOR ' + @column;
EXECUTE sp_executesql @constraintQuery;
END;
只需填写参数并执行。该脚本删除现有约束并创建一个具有指定默认值的新约束。
【讨论】:
这是所有与“如何更改列的默认值”相关的问题的最佳答案?它考虑到存在一个现有的默认值,并且该默认值可能具有系统生成的名称,并且可以编写脚本并且不依赖于手动观察/操作。【参考方案2】:我认为这里的问题在于 Create Table
和 Alter Table
命令之间的混淆。
如果我们查看Create table
,那么我们可以同时添加一个默认值和默认约束:
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ]
[ <column_constraint> [ ...n ] ]
[ <column_index> ]
ex:
CREATE TABLE dbo.Employee
(
CreateDate datetime NOT NULL
CONSTRAINT DF_Constraint DEFAULT (getdate())
)
ON PRIMARY;
您可以在此处检查完整的定义: http://msdn.microsoft.com/en-IN/library/ms174979.aspx
但是如果我们查看Alter Table
定义,那么使用ALTER TABLE ALTER COLUMN
你不能添加
CONSTRAINT
可用于ADD
的选项有:
| ADD
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
[ ,...n ]
在这里查看:http://msdn.microsoft.com/en-in/library/ms190273.aspx
因此,您必须为 Altering 列编写两个不同的语句:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
另一个用于更改表并添加默认约束
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
希望对你有帮助!!!
【讨论】:
就在现场。如果我理解正确,微软需要更新他们的内容:msdn.microsoft.com/en-us/library/ms187742%28v=sql.110%29.aspx no ..如果您正确阅读了第一行,那么它Specifies the properties of a column that is **added** to a table by using ALTER TABLE. So you can always write something as:
ALTER TABLE ADD COLUMN .. CONSTRAINT .. DEFAULT ; `
哇,你又说对了 :) 微软需要把那些星星放在“添加”周围哈哈
很高兴看到它对您有所帮助..:)【参考方案3】:
应该是-
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
【讨论】:
【参考方案4】:来自 MSDN ALTER TABLE 示例:
D.向现有列添加 DEFAULT 约束
以下示例创建一个包含两列的表,并将一个值插入第一列,而另一列保持 NULL。然后将 DEFAULT 约束添加到第二列。为了验证是否应用了默认值,在第一列中插入另一个值,并查询表。
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO
简而言之,您需要ADD CONSTRAINT
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL ;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
【讨论】:
【参考方案5】:要更改现有列,您需要:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
【讨论】:
以上是关于更改列默认值的主要内容,如果未能解决你的问题,请参考以下文章