모든 외부 키 및 제약 조건을 무시하는 SQL 행 삭제
테이블에 줄이 있어요.이 행에는 수백만 행이 있는 몇 개의 다른 테이블에서 참조되는 ID 열이 있습니다.행을 삭제하는 SQL 문은 항상 시간 초과됩니다.제 디자인으로 볼 때 삭제하고자 하는 행은 다른 곳에서도 참조되지 않는다는 것을 알고 있습니다.따라서 저는 SQL이 이 행에 대한 외부 키 참조를 위해 다른 모든 테이블을 확인해야 하는 것을 무시하고 행을 즉시 삭제하기를 원합니다.SQL 2008에서 이를 신속하게 수행할 수 있는 방법이 있습니까?아마도 다음과 같은 것들이 있을 것입니다.
DELETE FROM myTable where myTable.ID = 6850 IGNORE CONSTRAINTS
아니면 그 선을 따라 무언가.
해당 테이블/열에서 제약 조건을 일시적으로 선택하지 않도록 설정한 다음 제약 조건을 다시 활성화할 수 있습니다.일반적인 형태는 다음과 같습니다.
ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName
그런 다음 모든 제약 조건을 다시 활성화합니다.
ALTER TABLE TableName CHECK CONSTRAINT ConstraintName
제가 보기엔 이게 일시적인 것 같은데요?당신은 분명히 이것을 지속적으로 하고 싶지 않을 것입니다.
예, 간단히 실행합니다.
DELETE FROM myTable where myTable.ID = 6850
그리고 엔진이 제약조건을 확인하게 해주세요.
만약 여러분이 '똑똑하게' 제약 조건을 비활성화하려고 한다면, 여러분은 엄청난 대가를 치르게 될 것입니다. 제약 조건을 다시 활성화하려면 방금 삭제한 행 대신 모든 행을 확인해야 합니다.제약 조건이 '신뢰'되었는지 여부에 대해 SQL이 확인하는 내부 플래그가 있습니다.최적화를 수행하면 이러한 플래그가 'false'(SQL이 더 이상 제약 조건을 신뢰하지 않음을 의미함)로 변경되거나 처음부터 다시 확인해야 합니다.
인덱스 및 제약 조건 및 신뢰할 수 없는 제약 조건 및 성능 비활성화에 대한 지침을 참조하십시오.
DELETE 작업의 제약 조건 검증이 성능 병목 현상임을 입증하는 몇 가지 확실한 측정을 수행하지 않는 한, 엔진이 제 기능을 하도록 하십시오.
어떤 경우에도 제약 조건을 비활성화하지 마십시오.이것은 아주 어리석은 관행입니다.이런 일을 하면 데이터 무결성을 유지할 수 없습니다.데이터 무결성은 데이터베이스가 없으면 아무것도 없기 때문에 데이터베이스의 첫 번째 고려 사항입니다.
부모 레코드를 삭제하기 전에 자식 테이블에서 삭제하는 것이 올바른 방법입니다.대규모 데이터베이스에서 또 다른 잘못된 관행인 계단식 델타를 설정했기 때문에 시간 초과를 할 수 있습니다.
이것이 오래된 스레드라는 것을 알고 있지만 행 삭제가 외국 키 제약으로 차단되었을 때 여기에 착륙했습니다.저의 경우, 제 테이블 디자인은 제한된 열에 "NULL" 값을 허용했습니다.삭제할 행에서 제한된 열 값을 "NULL"(외국 키 제한에 위배되지 않음)로 변경한 후 모든 행을 삭제했습니다.
모든 테스트 데이터라 두 테이블의 모든 기록을 삭제하고 싶었습니다.SSMS GUI를 사용하여 일시적으로 FK 제약을 비활성화한 다음 두 테이블 모두에서 DELETE 쿼리를 실행한 후 최종적으로 FK 제약을 다시 활성화했습니다.
FK 제약 조건을 비활성화하려면:
- 데이터베이스 개체 확장 [1]
- 종속 테이블 개체 확장 [2]
- '키' 폴더를 펼칩니다.
- 외래키에서 오른쪽 클릭
- '수정' 옵션을 선택합니다.
- '외국 키 제약 조건 적용' 옵션을 '아니오'로 변경합니다.
- 'Foreign Key Relations' 창을 닫습니다.
- 테이블 디자이너 탭 닫기
- 변경 내용 확인 메시지가 나타나면
- 필요한 삭제 쿼리 실행
- 외부 키 제약 조건을 방금 비활성화한 것과 동일하게 다시 활성화합니다.
[1] 'Object Explorer' 창에서 'View(보기)' 메뉴 옵션 또는 F8 키를 통해 액세스할 수 있습니다.
[2] 종속 테이블이 무엇인지 잘 모를 경우 해당 테이블을 마우스 오른쪽 버튼으로 클릭하고 '의존성 보기' 옵션을 선택하여 확인할 수 있습니다.
MySQL에서 외부 키 검사를 비활성화하는 방법입니다.MS SQL Server를 사용하기 때문에 OP의 질문과는 관련이 없지만 Google 검색 결과에서 이를 표시하므로 참고할 사항은 다음과 같습니다.
SET FOREIGN_KEY_CHECKS = 0;
/스크립트 실행 /
SET FOREIGN_KEY_CHECKS = 1;
이 되는지 . 이건 그들을 무시하기 위한 것입니다.foreign key
수표 잘못된 그러나 이 기능을 삭제하는 것은 매우 잘못된 관행입니다.
이 테이블을 가리키는 외부 키가 있는 모든 테이블에서 다음을 사용합니다.
ALTER TABLE MyOtherTable NOCHECK CONSTRAINT fk_name
다음 코드 줄을 사용하여 데이터베이스의 모든 제약 조건을 비활성화할 수 있습니다.
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
update/delete 명령을 실행한 후 다음과 같이 다시 활성화할 수 있습니다.
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
제약 조건을 비활성화했다가 다시 활성화할 수 있습니다.
http://sqlforums.windowsitpro.com/web/forum/messageview.aspx?catid=60&threadid=48410&enterthread=y
테이블 T-SQL, SQL Server에서 일시적으로 제약 조건 사용 안 함
ALTER TABLE TableName NOCHECK CONSTRAINT ALL
ALTER TABLE TableName CHECK CONSTRAINT ALL
ALTER TABLE TableName NOCHECK CONSTRAINT FK_Table_RefTable
ALTER TABLE TableName CHECK CONSTRAINT FK_Table_RefTable
DELETE FROM TableName
DBCC CHECKIDENT ('TableName', RESEED, 0)
SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking.
TRUNCATE TABLE [YOUR TABLE];
SET FOREIGN_KEY_CHECKS = 1;
테스트 목적으로만 MySQL에서 다음 명령어를 사용하여 외부 키 참조가 있는 테이블에서 하나의 레코드만 삭제했습니다.
SET FOREIGN_KEY_CHECKS = 0; -- Disabling foreign key checks before running the following query.
DELETE FROM table_name WHERE id = id_to_delete; -- Deleting a record from a table that has foreign key reference.
SET FOREIGN_KEY_CHECKS = 1; -- Enabling foreign key checks after running the above query.
언급URL : https://stackoverflow.com/questions/1863066/deleting-a-sql-row-ignoring-all-foreign-keys-and-constraints
'programing' 카테고리의 다른 글
데이터베이스를 DataGrip(0xDBE)으로 가져옵니다. (0) | 2023.09.25 |
---|---|
비동기 테스트 및 후크의 경우 "done()"이 호출되었는지 확인하고, 약속을 반환하는 경우 해결되었는지 확인합니다. (0) | 2023.09.25 |
안드로이드 토스트가 토스트보다 더 길 수 있습니까?LEGTH_LONG? (0) | 2023.09.25 |
Mysql: 루틴 오류로 인해 사용자 ''@'localhost''에 대해 명령 실행이 거부되었습니다. (0) | 2023.09.25 |
XML 파일을 파워셸에 저장하려면 완전한 경로가 필요합니다. 왜죠? (0) | 2023.09.25 |