DATABASE

[Mssql] Table drop시 FOREIGN KEY 참조로 삭제 불가능

개폰지밥 2024. 6. 14. 19:43
반응형
삭제하고 싶은 테이블 조회
SELECT * FROM 테이블명;
SELECT * FROM [dbo].[QESServicesNames];

 

테이블 삭제
drop table 테이블명;
drop table [dbo].[QESServicesNames];


-> 에러  : Msg 3726, Level 16, State 1, Line 5
개체 'dbo.QESServicesNames'은(는) FOREIGN KEY 제약 조건에서 참조하므로 삭제할 수 없습니다.


-> 에러 해결 :  Table을 삭제하려면, FOREIGN KEY를 먼저 삭제해야한다.

Foreign key의 이름을 알면 바로 alter table 테이블명 drop constraint FK이름; 으로 삭제 할 수 있지만

Foreign key의 이름을 몰라서 2가지 방법으로 조회해봤다.

 

FK 이름 조회 (2가지 방법)
-- check name of foreign key
-- 1) first way
SELECT 
   f.name,
   OBJECT_NAME(f.parent_object_id) TableName,
   COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM 
   sys.foreign_keys AS f
INNER JOIN 
   sys.foreign_key_columns AS fc 
      ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN 
   sys.tables t 
      ON t.OBJECT_ID = fc.referenced_object_id
WHERE 
   OBJECT_NAME (f.referenced_object_id) = 'QESServicesNames'

 

 

-- 2) second way
sp_helpconstraint 테이블명;
sp_helpconstraint QESServicesNames;

 

 

 

-- drop FK
ALTER TABLE 테이블명 DROP CONSTRAINT FK명;
ALTER TABLE QESServices DROP CONSTRAINT FK_QESServices_QESServicesNames;


--> but failed
- 에러 : Msg 3728, Level 16, State 1, Line 36
'FK_QESServices_QESServicesNames'은(는) 제약 조건이 아닙니다.
Msg 3727, Level 16, State 0, Line 36
제약 조건을 삭제할 수 없습니다. 이전 오류를 참조하십시오.

-> 에러 해결 : FK 이름을 인식할 수 있게  단순하게 변경하면 삭제할 수 있음. 

 

FK명 변경 방법
sp_rename '변경하고싶은FK명', '변경하고싶은FK명';
sp_rename 'FK_QESServices_QESServiceNames', 'FK_QESServiceId';

 

변경된 FK 확인
sp_helpconstraint 테이블명;
sp_helpconstraint QESServicesNames;

 

drop FK again


삭제시 주의할 사항으로는 FK가 연결된 테이블의 FK를 삭제해주면 된다.
나는 QESServicesName 테이블과 QESServices 테이블의 FK가 연결되어있기 때문에 QESServices 테이블의 FK를 삭제해줬다.

ALTER TABLE 테이블명 DROP CONSTRAINT FK명;
ALTER TABLE [dbo].[QESServices] DROP CONSTRAINT FK_QESServiceId;

 

 DROP QESServiceName

 

드디어 테이블이 삭제 되는것을 확인할 수 있다.

drop table 테이블명;
drop table [dbo].[QESServicesNames];

테이블 삭제 최종확인
SELECT * FROM 테이블명;
SELECT * FROM [dbo].[QESServicesNames];

 

반응형