sqlserver有時候需要修改一個字段的默認值,卻發現修改(update)不了,也刪除(delete)不了,排查發現,需要先刪除原有的默認值約束,才行;步驟如下1、2、3。
若原來這個字段就沒有默認值,則直接執行步驟3的sql;注意,需要顯示聲明默認值約束,否則系統會默認生成后綴為隨機字符串的約束;不利於維護和無法做到見名知意。
1,刪除原有字段上的默認值約束
use [yourDBName];--數據庫名
declare @tableName nvarchar(100);--表名
declare @columnName nvarchar(100);--列名
declare @cnt nvarchar(100);
declare @sqlcmd nvarchar(1024);
set @tableName='yourTableName'
set @columnName='yourColumnName'
select @cnt= b.name from sysobjects b join syscolumns a on b.id = a.cdefault where a.id = object_id(@tableName) and a.name = @columnName
set @sqlcmd = 'ALTER TABLE '+ @tableName +' DROP constraint ' + @cnt;
exec sp_executesql @sqlcmd
2,刪除該字段
ALTER TABLE [schema].[yourTableName] DROP column yourColumnName
3,重新添加字段
ALTER TABLE [dbo].[yourTableName] ADD yourColumnName int NOT NULL
CONSTRAINT DF_yourTableName_yourColumnName DEFAULT ((-1));
EXEC sp_addextendedproperty N'MS_Description', N'字段注釋', N'SCHEMA', N'dbo',N'TABLE', N'yourTableName', N'COLUMN', N'yourColumnName ';
4,關於sqlserver約束,這篇文章總結的不錯
https://www.cnblogs.com/wy123/p/9205079.html#4431990
5,擴展:為什么要設置數據庫字段 default xxx not null ?
1,mysql存儲null需要占用space來標識這個字段是不是存的null;如果default 空 那就完美了,因為空不占用space!
2,sqlserver:如果一個表字段中含有NULL的數據(NULL表示可以為任何值),那么,SQL Server在做數據庫比較操作的時候,會使用三值邏輯(TRUE,FALSE,UNKNOWN),而不是平時的二值邏輯(TRUE,FALSE)。因此,在做數據庫設計的時候,我們都要求盡量將表不要設置為NULL類型,如果業務要求需要有空值,我們盡量用實際的默認值來代替NULL(int我們用0,字符串可以是空串等),這樣SQL Server在做比較運算就不會使用到相對復雜的三值邏輯,而采用二值邏輯。