programing

SQL 서버에서 외부 키 제약 조건을 제거하는 방법은 무엇입니까?

minimums 2023. 6. 22. 21:38
반응형

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 자체에서 외부 키 제약 조건을 삭제할 수도 있습니다.명령이 작동하지 않으면 시도할 수 있습니다.

  1. 데이터베이스 보기를 확장합니다.
  2. 외부 키 제약 조건이 있는 테이블을 마우스 오른쪽 버튼으로 클릭합니다.설계를 선택합니다.테이블 열에 대한 정보가 있는 탭이 열립니다.
  3. 외부 키 참조가 있는 열을 마우스 오른쪽 버튼으로 클릭합니다.또는 아무 열이나 마우스 오른쪽 단추로 클릭할 수 있습니다.관계를 선택합니다.
  4. 관계 목록이 팝업 창에 나타납니다(관계가 있는 경우).
  5. 여기서 외부 키 제약 조건을 삭제할 수 있습니다.

그게 도움이 되길 바랍니다.

테이블의 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

반응형