source

SQL Server 테이블에서 외부 키가 있는 데이터 삭제

itover 2023. 6. 26. 22:34
반응형

SQL Server 테이블에서 외부 키가 있는 데이터 삭제

다른 테이블(하위)과 관련된 SQL Server 테이블(상위)의 데이터를 삭제합니다.
기본 Delete 쿼리를 사용해 보았습니다.하지만 그것은 작동하지 않습니다 (그리고 저는 그것이 작동하지 않을 것이라는 것을 압니다)

DELETE FROM table WHERE ...

다음 오류로 인해 반환되었습니다.

DELETE 문이 참조 제약 조건과 충돌했습니다...

저는 테이블의 스키마를 유지해야 합니다.쿼리에 단어를 몇 개 추가하면 된다는 것을 알고 있습니다. 전에도 이 작업을 한 적이 있지만, 기억이 나지 않았습니다.

삭제 전후에 외부 키 제약 조건을 비활성화했다가 다시 활성화할 수 있습니다.

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

하위 항목을 수동으로 삭제해야 합니다.<condition>두 쿼리 모두 동일합니다.

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>;

삭제를 자동으로 수행하려면 외부 키 제약 조건이 다음과 같이 되도록 스키마를 변경해야 합니다.ON DELETE CASCADE.

자세한 내용은 계단식 참조 무결성 제약 조건의 MSDN 페이지를 참조하십시오.

ETA(포스터에서 설명한 후)스키마를 업데이트할 수 없는 경우 먼저 영향을 받는 하위 레코드를 수동으로 삭제해야 합니다.

여기서 "자녀" 테이블에 대한 외래 키를 추가합니다.

ALTER TABLE child
ADD FOREIGN KEY (P_Id)
REFERENCES parent(P_Id) 
ON DELETE CASCADE
ON UPDATE CASCADE;

그 후에 이렇게 "부모" 테이블에 DELETE 쿼리를 만들면

DELETE FROM parent WHERE .....

자식이 DELETE CASCADE를 가진 부모에 대한 참조를 가지고 있기 때문에, "자녀" 행도 "부모!"와 함께 삭제됩니다.

그래서, 당신은 할 필요합니다.DELETE부터 돌된테 행또더논리행적인에 대한 행UPDATE의 재산FOREIGN KEY 다른항참할열조를 하는 열PRIMARY KEY부모 테이블에서 가져온 것입니다.

또한 삭제하지 않음그냥 하지 않음 기사를 읽어보는 것이 좋습니다.

parent_child 관계가 있는 테이블에서 데이터를 삭제하려면 먼저 join을 언급하여 자식 테이블에서 데이터를 삭제한 다음 부모 테이블에서 데이터를 삭제해야 합니다. 예는 다음과 같습니다.

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


DELETE  ParentTable
WHERE <WHERE CONDITION>

데이터베이스의 모든 테이블에 있는 모든 데이터를 삭제할 수 있는 전체 스크립트를 사용합니다. 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

트리거를 사용하여 기본 키를 참조하는 항목을 삭제했습니다.스키마를 변경할 수 없는 경우 이 작업을 수행할 수 있을지는 확실하지 않지만 SQLite의 예는 다음과 같습니다.

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

이렇게 하면 부모 항목을 삭제할 때마다 자식 항목이 먼저 삭제됩니다.

간단한 솔루션:

MySQL 제어판을 사용하여 하위 테이블 삭제:

enter image description here

SQL 문 삭제 전후에 Foreign_KEY_CHECKS를 설정합니다.

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

출처: https://alvinalexander.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys .

SET foreign_key_checks = 0;
DELETE FROM yourtable;
SET foreign_key_checks = 1;

언급URL : https://stackoverflow.com/questions/8251146/delete-data-with-foreign-key-in-sql-server-table

반응형