SQL Server删除带“默认值”字段的需求探索

2021-11-19 09:37:22 浏览数 (1)

某位兄弟问了一个问题,“SQL server中怎么删除带默认值的字段”?

这是什么意思?

我们知道,在Oracle中,不管你带不带默认值,删除字段就是alter table ... drop column ...,为什么到了SQL Server,有其他的讲究?

原来这个SQL Server的字段,不是普通定义的表字段,而是通过这几个操作定义的。

1. 创建一个默认值对象,

代码语言:javascript复制
if not exists
(select 1 from sys.sysobjects where uid=schema_id(schema_name()) 
and name like 'chardt' and xtype = 'D') 
exec sp_executesql N'create default [chardt] as '''''

2. 创建一个类型,

代码语言:javascript复制
if not exists
(select 1 from sys.systypes where uid=schema_id(schema_name()) 
and name = 'dtkind') 
create type [dtkind] from char(1) not null

3. 绑定这个类型的默认值是刚才创建的chardt,

代码语言:javascript复制
绑定这个类型的默认值是chardft
exec sp_bindefault chardt, dtkind

创建表的时候,列c定义为dtkind类型,删除这个列c,应该怎么做?

代码语言:javascript复制
create table t
(
  ... 
  c  dtkind,
  ...
)
go

针对这个场景,微软的官方文档,给出了解释,

https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-default-transact-sql?view=sql-server-ver15

1. 如果默认值,还未绑定到列,可以用DROP DEFAULT,删除默认值,

2. 如果默认值,已经绑定到列,则需要解绑,才可用alter table ... drop column ...,删除列,

提醒一下,在SQL Server 2019的下一个版本,将不支持DROP DEFAULT,

不同的数据库,在一些功能上,还是有些区别,官方文档,就是我们寻找线索最重要的途径之一。每个功能,都会有他的设计和用意,这就需要我们在用的过程中,深深体会了。

0 人点赞