F
flyingboat
Unregistered / Unconfirmed
GUEST, unregistred user!
在SQLSERVER中创建的字段经常会出现过一段时间DROP其中的字段会出错的问题,
比如在查询分析器中执行:'alter table tbTest1 drop column bn'会出现下面的出错提示:
"
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'DF__tbTest1__bn__15DA3E5D' 依赖于 列 'bn'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE DROP COLUMN bn 失败,因为有一个或多个对象访问此列。
"
仔细分析的数据库中的系统表后发现是字段存在一个默认约束,因而在直接删除此字段时会出错!
需要先把这个默认约束DROP后才能正常地DROP这个字段.
但奇怪的是我在创建表的SQL语句中只定义了表的主键及字段的ISNULL约束,如:
create table tbtest1 (bh int not null,mc varchar(10) null )
并没有定义字段的默认约束,那么这个约束是哪来的呢?是SQLSERVER自动创建的吗?
那它为什么要为字段创建这么一个默认约束呢,难不成是吃饱了撑的[]
而且并不是表中的每一个字段都会有这个默认约束,
可以通过执行下面这个SQL语句看到表中每个字段的是否存在一个默认约束:
select table_name=a.name,col_name=c.name,def_name=b.name,col_id=c.id,def_id=c.cdefault
from sysobjects a,sysobjects b,syscolumns c
where a.id=c.id and c.cdefault*=b.id
and a.name='tbtest1'-- and c.name='bbb'
虽然用DROP这个SQL语句无法直接删除被定义了默认约束的字段,
但在企业管理器的表设计器中删除字段却不会出异常,不知道看来这个默认约束是不是Microsoft有意加的,
但原因和作用何在我就百思不得其解了!
说了这么多,是想了解一个其它用SQLSERVER的朋友们是否也碰到过这个问题,
是否有更好的办法可以避免这种情况呢?或者通过对数据库选项进行设置就可以解决?
实在不行的话在DROP COLUMN前只有先查询有没有默认约束并DROP这个约束了!
比如在查询分析器中执行:'alter table tbTest1 drop column bn'会出现下面的出错提示:
"
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'DF__tbTest1__bn__15DA3E5D' 依赖于 列 'bn'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE DROP COLUMN bn 失败,因为有一个或多个对象访问此列。
"
仔细分析的数据库中的系统表后发现是字段存在一个默认约束,因而在直接删除此字段时会出错!
需要先把这个默认约束DROP后才能正常地DROP这个字段.
但奇怪的是我在创建表的SQL语句中只定义了表的主键及字段的ISNULL约束,如:
create table tbtest1 (bh int not null,mc varchar(10) null )
并没有定义字段的默认约束,那么这个约束是哪来的呢?是SQLSERVER自动创建的吗?
那它为什么要为字段创建这么一个默认约束呢,难不成是吃饱了撑的[]
而且并不是表中的每一个字段都会有这个默认约束,
可以通过执行下面这个SQL语句看到表中每个字段的是否存在一个默认约束:
select table_name=a.name,col_name=c.name,def_name=b.name,col_id=c.id,def_id=c.cdefault
from sysobjects a,sysobjects b,syscolumns c
where a.id=c.id and c.cdefault*=b.id
and a.name='tbtest1'-- and c.name='bbb'
虽然用DROP这个SQL语句无法直接删除被定义了默认约束的字段,
但在企业管理器的表设计器中删除字段却不会出异常,不知道看来这个默认约束是不是Microsoft有意加的,
但原因和作用何在我就百思不得其解了!
说了这么多,是想了解一个其它用SQLSERVER的朋友们是否也碰到过这个问题,
是否有更好的办法可以避免这种情况呢?或者通过对数据库选项进行设置就可以解决?
实在不行的话在DROP COLUMN前只有先查询有没有默认约束并DROP这个约束了!