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];
반응형