programing

모든 외부 키 및 제약 조건을 무시하는 SQL 행 삭제

powerit 2023. 9. 25. 23:11
반응형

모든 외부 키 및 제약 조건을 무시하는 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. 데이터베이스 개체 확장 [1]
  2. 종속 테이블 개체 확장 [2]
  3. '키' 폴더를 펼칩니다.
  4. 외래키에서 오른쪽 클릭
  5. '수정' 옵션을 선택합니다.
  6. '외국 키 제약 조건 적용' 옵션을 '아니오'로 변경합니다.
  7. 'Foreign Key Relations' 창을 닫습니다.
  8. 테이블 디자이너 탭 닫기
  9. 변경 내용 확인 메시지가 나타나면
  10. 필요한 삭제 쿼리 실행
  11. 외부 키 제약 조건을 방금 비활성화한 것과 동일하게 다시 활성화합니다.

[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에서 일시적으로 제약 조건 사용 안 함

MSSQL

  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

ref

  DELETE FROM TableName
  
  DBCC CHECKIDENT ('TableName', RESEED, 0)

MySql

  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

반응형