[sql-server] SQL DROP TABLE 외래 키 제약 조건

이와 같이 데이터베이스의 모든 테이블을 삭제하려면 외래 키 제약 조건을 처리합니까? 그렇지 않다면 어떻게해야합니까?

GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
    DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
    DROP TABLE dbo.[Student]



답변

아니요, 실제로 참조하는 외래 키가 있으면 테이블이 삭제되지 않습니다.

테이블을 참조하는 모든 외래 키 관계를 얻으려면이 SQL을 사용할 수 있습니다 (SQL Server 2005 이상인 경우).

SELECT *
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

이 문장이 있으면 SQL 문을 만들어 실제로 FK 관계를 삭제할 수 있습니다.

SELECT
    'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) +
    '].[' + OBJECT_NAME(parent_object_id) +
    '] DROP CONSTRAINT [' + name + ']'
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')


답변

SQL Server Management Studio 2008 (R2) 이상에서는 마우스 오른쪽 단추로

DB-> 작업-> 스크립트 생성

  • 삭제하려는 테이블을 선택하십시오.

  • “새 쿼리 창에 저장”을 선택하십시오.

  • 고급 버튼을 클릭하십시오.

  • 스크립트 DROP 및 CREATE를 스크립트 DROP으로 설정하십시오.

  • 스크립트 외래 키를 True로 설정하십시오.

  • 확인을 클릭하십시오.

  • 다음-> 다음-> 완료를 클릭하십시오.

  • 스크립트를 본 다음 실행하십시오.


답변

“자식”테이블을 먼저 삭제하면 외래 키도 삭제됩니다. “부모”테이블을 먼저 삭제하려고하면 “FOREIGN KEY 제약 조건에 의해 참조되므로 개체 ‘a’를 삭제할 수 없습니다.”가 표시됩니다. 오류.


답변

다음은 sp_MSdropconstraints프로 시저를 사용하여 모든 테이블을 올바르게 삭제하는 다른 방법 입니다. 내가 생각할 수있는 가장 짧은 코드 :

exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";


답변

SQL Server 인 경우 테이블을 삭제하기 전에 제약 조건을 삭제해야합니다.


답변

@mark_s가 게시 한 것의 약간 더 일반적인 버전으로 인해 도움이되었습니다.

SELECT
'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(k.parent_object_id) +
'.[' + OBJECT_NAME(k.parent_object_id) +
'] DROP CONSTRAINT ' + k.name
FROM sys.foreign_keys k
WHERE referenced_object_id = object_id('your table')

테이블 이름을 연결하고 결과를 실행하십시오.


답변

FOR XML PATH('')여러 입력 행을 단일 출력 행으로 병합 할 수 있는 연결 트릭을 사용하여 테이블 자체가 뒤 따르는 모든 제약 조건을 삭제하는 또 다른 방법 이 있습니다. SQL 2005 이상에서 작동해야합니다.

EXECUTE 명령은 안전을 위해 주석 처리되었습니다.

DECLARE @SQL NVARCHAR(max)
;WITH fkeys AS (
    SELECT quotename(s.name) + '.' + quotename(o.name) tablename, quotename(fk.name) constraintname
    FROM sys.foreign_keys fk
    JOIN sys.objects o ON fk.parent_object_id = o.object_id
    JOIN sys.schemas s ON o.schema_id = s.schema_id
)
SELECT @SQL = STUFF((SELECT '; ALTER TABLE ' + tablename + ' DROP CONSTRAINT ' + constraintname
FROM fkeys
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

SELECT @SQL = STUFF((SELECT '; DROP TABLE ' + quotename(TABLE_SCHEMA) + '.' + quotename(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)