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