各位大侠救命:
小弟想要删除在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 约束引用。
小弟想要删除在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 约束引用。
delete from test
ALTER TABLE yourtable ENABLE(DISABLE) TRIGGER ALL
还有
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' 附近有语法错误。
(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)
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 --禁止触发器
CONSTRAIT 为 CONSTRAINT
TRIGER 为 TRIGGER
ALTER TABLE yh001.dbo.bm NOCHECK CONSTRAINT ALL delete from yh001.dbo.bmALTER 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'。
语句已终止。
您看我这样写为啥也不行呢?
ALTER TABLE yh001.dbo.bm NOCHECK CONSTRAINT ALL
ALTER TABLE yh001.dbo.bm DISABLE TRIGGER ALL
delete from yh001.dbo.bmALTER 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'。
语句已终止。
你这种情况就是外键约束的问题
你禁用了表bm的约束但是没有禁用表dw的约束,
也就是说你把表dw的相关联的外键删除了当然会报错,再加一句
ALTER TABLE yh001.dbo.dw NOCHECK CONSTRAINT ALL
如果还其他被依靠的表也要加进去,
不过我对你这种做法置怀疑态度,你把外键删除掉了你的约束也不可能再打开,因为你破坏了数据的完整性除非是特殊应用
您好!
其实我是在用SQL恢复数据表,仅仅进行恢复主表,其它的表不进行恢复,所以才这样做的
先删除,然后用备份的表进行全添加。
你的意思是不是说如果有约束的子表也要进行取消约束,那我咱样才能在系统表查到与其
相关联的子表哪?不胜感激
其实我也是这样做的,但是我得进进行恢复时就得先删除原有的数据表中的内容,然后
进行恢复,在恢复前,就得先删除原有数据,所以问题就出来了:)嘿嘿
不好意思!