Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 删除SQL Server表中具有外键的数据_Sql Server - Fatal编程技术网

Sql server 删除SQL Server表中具有外键的数据

Sql server 删除SQL Server表中具有外键的数据,sql-server,Sql Server,我将删除与另一个表(子表)有关系的SQL Server表(父表)中的数据。 我尝试了基本的删除查询。但它不起作用(我知道它不会起作用) 它返回以下错误 DELETE语句与引用约束冲突 我需要保留表的模式。我知道我只需要在查询中添加一些单词,我以前做过,但我就是想不起来了。如果您希望自动删除,您需要更改模式,以便在删除级联时外键约束为 有关更多信息,请参阅 ETA(在海报澄清后):如果无法更新架构,则必须先手动删除受影响的子记录。您可以在删除之前和之后禁用并重新启用外键约束: alter tabl

我将删除与另一个表(子表)有关系的SQL Server表(父表)中的数据。
我尝试了基本的删除查询。但它不起作用(我知道它不会起作用)

它返回以下错误

DELETE语句与引用约束冲突


我需要保留表的模式。我知道我只需要在查询中添加一些单词,我以前做过,但我就是想不起来了。

如果您希望自动删除,您需要更改模式,以便在删除级联时外键约束为

有关更多信息,请参阅


ETA(在海报澄清后):如果无法更新架构,则必须先手动删除受影响的子记录。

您可以在删除之前和之后禁用并重新启用外键约束:

alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all

因此,您需要
从冲突表中删除相关行,或者从
更新
它们的
外键列中删除相关行,以引用父表中的其他
主键


此外,您可能想阅读本文

您需要手动删除子项。这两个查询的
是相同的

DELETE FROM child
FROM cTable AS child
INNER JOIN table AS parent ON child.ParentId = parent.ParentId
WHERE <condition>;

DELETE FROM parent
FROM table AS parent
WHERE <condition>;
DELETE FROM child
从孩提时代开始
在child.ParentId=parent.ParentId上作为父对象的内部联接表
哪里
从父级删除
作为父项从表中删除
哪里

要从具有父子关系的表中删除数据, 首先,您必须通过提及join从子表中删除数据,然后只需从父表中删除数据,示例如下:

DELETE ChildTable
FROM ChildTable inner join ChildTable on PParentTable.ID=ChildTable.ParentTableID
WHERE <WHERE CONDITION> 


DELETE  ParentTable
WHERE <WHERE CONDITION>
删除子表
从PParentTable.ID=ChildTable.ParentTableID上的ChildTable内部联接ChildTable
哪里
删除父表
哪里
在这里,您正在为“Child”表添加外键

之后,如果您像这样对“Parent”表进行删除查询

由于子级引用了具有DELETE CASCADE的父级,因此“子级”行也将被删除!和“家长”一起


可以删除数据库所有表中所有数据的有用脚本, 将tt替换为您的数据库名称:

declare @tablename nvarchar(100)
declare c1 cursor for
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='tt' AND TABLE_TYPE='BASE TABLE'

open  c1
fetch next from c1 into @tablename

while @@FETCH_STATUS = 0
    begin
    print @t1
        exec('alter table ' + @tablename + ' nocheck constraint all')
        exec('delete from ' + @tablename)
        exec ('alter table ' + @tablename + ' check constraint all')
        fetch next from c1 into @tablename
    end
close c1
DEALLOCATE c1

在delete SQL语句前后设置外键检查

SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
SET FOREIGN_KEY_CHECKS = 1;

来源:.

设置外键检查=0; 从表格中删除;
设置外键检查=1

我使用触发器删除引用主键的条目。如果无法更改架构,则不确定是否可以这样做,但以下是SQLite中的一个示例:

CREATE TRIGGER remove_parent
  BEFORE DELETE ON parent
BEGIN
  DELETE FROM
    child
  WHERE
    child.id = OLD.id;
END;

这样,每次删除父条目时,子条目也将首先被删除。

ah。我没有在我的帖子中告诉你,我必须在不改变模式的情况下让它工作。这是可能的,对吧?不,用一些神奇的查询选项或其他什么东西是不可能的。您需要手动执行删除操作。如果禁用约束,然后重新启用约束,那么重新启用不会因为断开的
外键
引用而失败吗?不,它仅在您将新值写入字段时检查约束-当您将签回时,它不会重新扫描整个表。好的。这意味着子表中的所有数据都将保留在那里。我将要删除2k行,如果我将数据保留在子表中,我认为这将非常庞大。我想我还是手工做吧。不管怎样,谢谢你们的回复。你应该得到+1:)这似乎有点“乱七八糟”,但在我的特殊情况下,我很高兴找到了这一点,我正在使用它。这两个删除可以结合在一起,我只需要写一次这个部分吗?我不相信@ThomasTempelmann。如果只想写入一次条件,则必须启用级联删除,而不是手动处理每个表。Alastair Maw在这里的答案也引用了这个选项。如果你不是级联删除,这是最好的答案。游标执行得很糟糕,删除要删除的约束可能会在其他表中留下孤立的行。问题是SQL Server,而不是MySQL仍然无法工作。这是我的错误
错误:表“问题”上的更新或删除违反了表“答案”上的外键约束“回答问题id”详细信息:键(问题id)=(14)仍从表“答案”引用。SQL状态:23503
declare @tablename nvarchar(100)
declare c1 cursor for
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='tt' AND TABLE_TYPE='BASE TABLE'

open  c1
fetch next from c1 into @tablename

while @@FETCH_STATUS = 0
    begin
    print @t1
        exec('alter table ' + @tablename + ' nocheck constraint all')
        exec('delete from ' + @tablename)
        exec ('alter table ' + @tablename + ' check constraint all')
        fetch next from c1 into @tablename
    end
close c1
DEALLOCATE c1
SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
SET FOREIGN_KEY_CHECKS = 1;
CREATE TRIGGER remove_parent
  BEFORE DELETE ON parent
BEGIN
  DELETE FROM
    child
  WHERE
    child.id = OLD.id;
END;