SQL 서버에서 외부 키 제약 조건을 제거하는 방법은 무엇입니까?
선택한 값을 삽입할 수 있도록 다른 테이블에서 외래 키를 제거하고 싶습니다.
제가 데이터베이스에 새로 들어왔기 때문에 외부 키 값을 삭제하거나 제거할 수 있는 올바른 SQL 쿼리를 알려주세요.
다음을 수행해 보십시오.
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
참조: http://www.w3schools.com/sql/sql_foreignkey.asp
참조 무결성과 관련하여 그렇게 하는 것은 잘못된 것입니다. 한번 고장나면 레코드를 검토하고 제약을 깨는 레코드를 삭제하지 않고 다시 켜는 것은 쉽지 않기 때문입니다.
어쨌든 구문은 다음과 같습니다.
ALTER TABLE Tablename DROP CONSTRAINT ContName;
MSDN 참조:
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]
하지만, 조심하세요, 일단 그렇게 하면, 당신은 다시는 기회를 얻지 못할 수도 있고, 당신은 기본적인 데이터베이스 책을 읽어야 합니다. 왜 우리가 외국 키가 필요한지.
DB에서 모든 제약 조건을 제거하려면:
SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE
제약 조건을 완전히 삭제하기 전에 (일시적으로) 비활성화를 고려해야 합니다.
표 작성 TSQL을 보면 다음과 같은 것을 볼 수 있습니다.
ALTER TABLE [dbo].[dbAccounting] CHECK CONSTRAINT [FK_some_FK_constraint]
실행할 수 있습니다.
ALTER TABLE [dbo].[dbAccounting] NOCHECK CONSTRAINT [FK_some_FK_constraint]
그런 다음 제약 조건을 위반하는 값을 삽입/업데이트한 다음 원본을 실행하여 다시 켭니다.CHECK
진술.
(과거에 물려받은 부실하게 설계된 시스템을 정리하기 위해 이 작업을 수행해야 했습니다.)
테이블의 모든 외부 키를 삭제합니다.
USE [Database_Name]
DECLARE @FOREIGN_KEY_NAME VARCHAR(100)
DECLARE FOREIGN_KEY_CURSOR CURSOR FOR
SELECT name FOREIGN_KEY_NAME FROM sys.foreign_keys WHERE parent_object_id = (SELECT object_id FROM sys.objects WHERE name = 'Table_Name' AND TYPE = 'U')
OPEN FOREIGN_KEY_CURSOR
----------------------------------------------------------
FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @DROP_COMMAND NVARCHAR(150) = 'ALTER TABLE Table_Name DROP CONSTRAINT' + ' ' + @FOREIGN_KEY_NAME
EXECUTE Sp_executesql @DROP_COMMAND
FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME
END
-----------------------------------------------------------------------------------------------------------------
CLOSE FOREIGN_KEY_CURSOR
DEALLOCATE FOREIGN_KEY_CURSOR
사용 중인 DB에 따라 구문 또는 다른 구문이 있습니다.
Oracle을 사용하는 경우 다른 사용자가 알려준 내용을 입력해야 합니다.
ALTER TABLE table_name DROP CONSTRAINT fk_name;
그러나 MySQL을 사용하면 구문 오류가 발생하며 대신 다음을 입력할 수 있습니다.
ALTER TABLE table_name DROP INDEX fk_name;
최초의 사용
show create table table_name;
표의 설명 구조를 확인합니다.
해당 표에서 사용한 외부 키에 대한 제약 조건이 표시될 수 있습니다.먼저 각 제약 조건을 삭제합니다.
alter table table_name drop constraint constraint_name;
그런 다음 원하는 각각의 외래 키 또는 열을 삭제합니다.행운을 빕니다!
ALTER TABLE table
DROP FOREIGN KEY fk_key
편집: 당신이 sql-server를 사용하는 것을 알아차리지 못했습니다. 죄송합니다.
ALTER TABLE table
DROP CONSTRAINT fk_key
다음 쿼리를 사용하여 모든 FK를 찾습니다.
Declare @SchemaName VarChar(200) = 'Schema Name'
Declare @TableName VarChar(200) = 'Table name'
-- Find FK in This table.
SELECT
'IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' +
'[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']'
+ ''') AND parent_object_id = OBJECT_ID(N''' +
'[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' +
'ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) +
'.[' + OBJECT_NAME(FK.parent_object_id) +
'] DROP CONSTRAINT ' + FK.name
, S.name , O.name, OBJECT_NAME(FK.parent_object_id)
FROM sys.foreign_keys AS FK
INNER JOIN Sys.objects As O
ON (O.object_id = FK.parent_object_id )
INNER JOIN SYS.schemas AS S
ON (O.schema_id = S.schema_id)
WHERE
O.name = @TableName
And S.name = @SchemaName
-- Find the FKs in the tables in which this table is used
SELECT
' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N''' +
'[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']'
+ ''') AND parent_object_id = OBJECT_ID(N''' +
'[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].['
+ OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' +
' ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) +
'.[' + OBJECT_NAME(FK.parent_object_id) +
'] DROP CONSTRAINT ' + FK.name
, S.name , O.name, OBJECT_NAME(FK.parent_object_id)
FROM sys.foreign_keys AS FK
INNER JOIN Sys.objects As O
ON (O.object_id = FK.referenced_object_id )
INNER JOIN SYS.schemas AS S
ON (O.schema_id = S.schema_id)
WHERE
O.name = @TableName
And S.name = @SchemaName
또는 SQL Server Management Studio 자체에서 외부 키 제약 조건을 삭제할 수도 있습니다.명령이 작동하지 않으면 시도할 수 있습니다.
- 데이터베이스 보기를 확장합니다.
- 외부 키 제약 조건이 있는 테이블을 마우스 오른쪽 버튼으로 클릭합니다.설계를 선택합니다.테이블 열에 대한 정보가 있는 탭이 열립니다.
- 외부 키 참조가 있는 열을 마우스 오른쪽 버튼으로 클릭합니다.또는 아무 열이나 마우스 오른쪽 단추로 클릭할 수 있습니다.관계를 선택합니다.
- 관계 목록이 팝업 창에 나타납니다(관계가 있는 경우).
- 여기서 외부 키 제약 조건을 삭제할 수 있습니다.
그게 도움이 되길 바랍니다.
테이블의 FK 이름이 자동으로 생성되어 정확히 무엇인지 볼 수 없는 경우(예를 들어 데이터베이스에 대한 권한이 없는 경우) 다음과 같은 방법을 시도할 수 있습니다.
DECLARE @table NVARCHAR(512), @sql NVARCHAR(MAX);
SELECT @table = N'dbo.Table';
SELECT @sql = 'ALTER TABLE ' + @table
+ ' DROP CONSTRAINT ' + NAME + ';'
FROM sys.foreign_keys
WHERE [type] = 'F'
AND [parent_object_id] = OBJECT_ID(@table);
EXEC sp_executeSQL @sql;
실제 FK 이름을 지정하지 않고 지정된 테이블의 제약 조건을 삭제하는 저장 프로시저를 빌드합니다.▁the▁▁whereraint▁const다▁the▁it삭니▁drops제하는 제약 조건을 삭제합니다.[type]
F(Foreign Key 제약 조건)와 같습니다.
참고: 표에 여러 개의 FK가 있으면 모두 삭제됩니다.따라서 이 솔루션은 대상 테이블에 FK가 하나만 있는 경우에 가장 적합합니다.
외부 키 제약 조건 이름을 모르는 경우 이 이름을 사용하여 찾아 보십시오.
sp_help 'TableName'
다른 스키마에 대해 추가로
sp_help 'schemaName.TableName'
그리고나서
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
더 안전한 쪽으로 가기 위해서는 모든 제약 조건을 설명하고 설명 섹션에 기록하십시오.
ALTER TABLE[table_name]
DROP CONSTRAINT Constraint_name
alter table <referenced_table_name> drop primary key;
외부 키 제약 조건이 제거됩니다.
언급URL : https://stackoverflow.com/questions/12489762/how-to-remove-foreign-key-constraint-in-sql-server
'programing' 카테고리의 다른 글
SQL Server : 식을 데이터 형식 int로 변환하는 동안 산술 오버플로 오류가 발생했습니다. (0) | 2023.06.22 |
---|---|
SQL Server의 모든 데이터베이스에 있는 모든 테이블을 단일 결과 집합으로 나열하려면 어떻게 해야 합니까? (0) | 2023.06.22 |
Microsoft SQL Server에서 데이터베이스 삭제 및 재생성 (0) | 2023.06.22 |
1L와 1L의 차이점은 무엇입니까? (0) | 2023.06.22 |
MongoSocketReadException: 스트림 끝에 너무 일찍 도달했습니다(일정 기간 동안 사용하지 않은 후). (0) | 2023.06.22 |