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 제어판을 사용하여 하위 테이블 삭제:
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
'source' 카테고리의 다른 글
| 루비 클래스의 이름을 어떻게 알 수 있습니까? (0) | 2023.06.26 |
|---|---|
| Kubernetes Java 응용 프로그램에서 최신 포드를 가져오는 방법 (0) | 2023.06.26 |
| SSH 키를 제거하려면 어떻게 해야 합니까? (0) | 2023.06.26 |
| API 'variant.getExternalNativeBuildTasks()'가 더 이상 사용되지 않으며 'variant.getExternalNativeBuildProviders()'로 대체되었습니다. (0) | 2023.06.26 |
| Angular 2 XMLHttpRequest에서 열기를 실행하지 못했습니다.잘못된 URL (0) | 2023.06.26 |
