SqlServer如何暂时关闭外键约束

youhongwei78 2003-06-23 11:32:47
各位大侠救命:
小弟想要删除在SqlServer中有外键约束的数据表,又不想把外键删除,所以想暂时关闭外键约束,等删除完毕再恢复外键约束,请各位大虾帮助!表名称Test
外键表Test1,字段:Filename分别为主键和外键!我是这样写的:
Delete From Test
错误提示:DELETE 语句与 Filename REFERENCE 约束 'FK__test__Filename__0E6E26BF' 冲突。该冲突发生于数据库 'Yh001',表 'test', column 'Filename'。语句已终止。
如果用如下Sql语句:
TRUNCATE table yh001.dbo.test
错误提示:
无法截断表 'yh001.dbo.test',因为该表正由 FOREIGN KEY 约束引用。

...全文
2675 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
youhongwei78 2003-06-24
  • 打赏
  • 举报
回复
各位大侠帮忙呀! 小弟不胜感激
blueshu 2003-06-23
  • 打赏
  • 举报
回复
delete from yh001
delete from test
haomao 2003-06-23
  • 打赏
  • 举报
回复
关注,帮你up
leo_chenji 2003-06-23
  • 打赏
  • 举报
回复
关注
youhongwei78 2003-06-23
  • 打赏
  • 举报
回复
DWGZ:
其实我也是这样做的,但是我得进进行恢复时就得先删除原有的数据表中的内容,然后
进行恢复,在恢复前,就得先删除原有数据,所以问题就出来了:)嘿嘿。。。
不好意思!
DWGZ 2003-06-23
  • 打赏
  • 举报
回复
找一个表的依靠对象与被依靠对象比较麻烦,因为它们是交叉的,我以前是这样做
把目的库所有的表的约束与触发器都关掉,再把源库里面的所有表导入到目的库里面,它们两个库的表结构都一样,当导入完成以后,因为源库满足数据的完整性,所有目的表当然也满足数据的完整性,再将约束与触发器的开关的打开
firetoucher 2003-06-23
  • 打赏
  • 举报
回复
不太明白你的意思
1 你的这种操作本来就是违反数据库的安全性的,应该进行级联删除;
2 可以得到其他外键的表,但你这样有什么用?
3 你可以直接删除外键而不是禁用,因为你可能已经破坏了数据库的完整性

youhongwei78 2003-06-23
  • 打赏
  • 举报
回复
DWGZ :
您好!
其实我是在用SQL恢复数据表,仅仅进行恢复主表,其它的表不进行恢复,所以才这样做的
先删除,然后用备份的表进行全添加。
你的意思是不是说如果有约束的子表也要进行取消约束,那我咱样才能在系统表查到与其
相关联的子表哪?不胜感激

DWGZ 2003-06-23
  • 打赏
  • 举报
回复
不好意思没有看到你的消息
你这种情况就是外键约束的问题
你禁用了表bm的约束但是没有禁用表dw的约束,
也就是说你把表dw的相关联的外键删除了当然会报错,再加一句
ALTER TABLE yh001.dbo.dw NOCHECK CONSTRAINT ALL
如果还其他被依靠的表也要加进去,
不过我对你这种做法置怀疑态度,你把外键删除掉了你的约束也不可能再打开,因为你破坏了数据的完整性除非是特殊应用
youhongwei78 2003-06-23
  • 打赏
  • 举报
回复
dwgz你好:
您看我这样写为啥也不行呢?
ALTER TABLE yh001.dbo.bm NOCHECK CONSTRAINT ALL
ALTER TABLE yh001.dbo.bm DISABLE TRIGGER ALL


delete from yh001.dbo.bm

ALTER TABLE yh001.dbo.bm CHECK CONSTRAINT ALL
ALTER TABLE yh001.dbo.bm Enable TRIGGER ALL


服务器: 消息 547,级别 16,状态 1,行 1
DELETE 语句与 COLUMN REFERENCE 约束 'FK__Dw__d_s_Bmdm__0E6E26BF' 冲突。该冲突发生于数据库 'Yh001',表 'Dw', column 'd_s_Bmdm'。
语句已终止。
youhongwei78 2003-06-23
  • 打赏
  • 举报
回复

ALTER TABLE yh001.dbo.bm NOCHECK CONSTRAINT ALL

delete from yh001.dbo.bm

ALTER TABLE yh001.dbo.bm CHECK CONSTRAINT ALL


服务器: 消息 547,级别 16,状态 1,行 1
DELETE 语句与 COLUMN REFERENCE 约束 'FK__Dw__d_s_Bmdm__0E6E26BF' 冲突。该冲突发生于数据库 'Yh001',表 'Dw', column 'd_s_Bmdm'。
语句已终止。

youhongwei78 2003-06-23
  • 打赏
  • 举报
回复
dwgz我试一试
DWGZ 2003-06-23
  • 打赏
  • 举报
回复
不好意思是,我的错在此向 youhongwei78(飞天木马) 道歉
CONSTRAIT 为 CONSTRAINT
TRIGER 为 TRIGGER
DWGZ 2003-06-23
  • 打赏
  • 举报
回复
兄弟这个也看不懂吗,我快晕了
ALTER TABLE yourtable CHECK(NOCHECK) CONSTRAIT ALL
是指
ALTER TABLE yourtable CHECK CONSTRAIT ALL --检查约束

ALTER TABLE yourtable NOCHECK CONSTRAIT ALL --不检查约束

ALTER TABLE yourtable ENABLE(DISABLE) TRIGGER ALL
是指
ALTER TABLE yourtable ENABLE TRIGER ALL --允放触发器

ALTER TABLE yourtable DISABLE TRIGER ALL --禁止触发器

firetoucher 2003-06-23
  • 打赏
  • 举报
回复
下例禁用用于限制可接受的薪水数据的约束。WITH NOCHECK CONSTRAINT 与 ALTER TABLE 一起使用,以禁用该约束并使正常情况下会引起约束违规的插入操作得以执行。WITH CHECK CONSTRAINT 重新启用该约束。

CREATE TABLE cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
)

-- Valid inserts
INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)
INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)

-- This insert violates the constraint.
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Disable the constraint and try again.
ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Reenable the constraint and try another insert, will fail.
ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (4,"Eric James",110000)

youhongwei78 2003-06-23
  • 打赏
  • 举报
回复
我在程序里控制,不能用企业管理器的,谢谢!
youhongwei78 2003-06-23
  • 打赏
  • 举报
回复
信誉的方法我测试了一下,还是不行,您还有没有更好的方法,谢谢,小弟很着急!
还有
ALTER TABLE yourtable CHECK(NOCHECK) CONSTRAIT ALL
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '(' 附近有语法错误。

如果用
ALTER TABLE yourtable CHECK(NOCHECK) CONSTRAIT ALL
则:
服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: 'CONSTRAIT' 附近有语法错误。



bbs791109 2003-06-23
  • 打赏
  • 举报
回复
樓主的想法很好﹐但是不可能的。

魚和熊掌不可兼得。
DWGZ 2003-06-23
  • 打赏
  • 举报
回复
ALTER TABLE yourtable CHECK(NOCHECK) CONSTRAIT ALL
ALTER TABLE yourtable ENABLE(DISABLE) TRIGGER ALL
zzzl 2003-06-23
  • 打赏
  • 举报
回复
打开sqlserver的企业管理器,想怎么删就怎么删
加载更多回复(1)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧