[sql-server] 기존 테이블에서 열을 제거하는 방법?

기존 테이블에서 열을 제거하는 방법?

나는 테이블 MENFname있고Lname

나는 제거해야합니다 Lname

어떻게합니까?



답변

ALTER TABLE MEN DROP COLUMN Lname


답변

일반적인:

ALTER TABLE table_name DROP COLUMN column_name;

귀하의 경우 :

ALTER TABLE MEN DROP COLUMN Lname;


답변

귀하의 예는 간단하고 추가 테이블 변경이 필요하지 않지만 일반적으로 이것은 간단하지 않습니다.

이 열이 다른 테이블에서 참조되는 경우 다른 테이블 / 열로 수행 할 작업을 파악해야합니다. 한 가지 옵션은 외래 키를 제거하고 참조 된 데이터를 다른 테이블에 유지하는 것입니다.

또 다른 옵션은 모든 참조 열을 찾아 더 이상 필요하지 않은 경우 제거하는 것입니다.

이러한 경우 실제 문제는 모든 외래 키를 찾는 것입니다. 시스템 테이블을 쿼리하거나 ApexSQL 검색 (무료) 또는 Red Gate Dependency 추적기 (프리미엄이지만 더 많은 기능) 와 같은 타사 도구를 사용하여이를 수행 할 수 있습니다 . 외래 키에 전체 스레드가 있습니다.


답변

이것이 정답입니다.

ALTER TABLE MEN DROP COLUMN Lname

A는하지만 … CONSTRAINT온 존재 COLUMN, 당신은해야한다 첫 번째는, 당신은 수있을 것 . 를 삭제하려면 다음을 실행하십시오.DROPCONSTRAINTDROPCOLUMNCONSTRAINT

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}


답변

에서 SQL 서버 2016 는 새로운 DIE 문을 사용할 수 있습니다.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

위 쿼리는 테이블에있는 drops경우에만 열을 다시 exists실행할 수 있습니다. 그렇지 않으면 오류가 발생하지 않습니다.

IF존재 여부를 확인하기 위해 큰 래퍼를 사용하는 대신column 삭제하기 전에 위의 DDL명령문을 실행할 수 있습니다 .


답변

문제는 존재하지 않는 테이블에서만 열을 삭제할 수 있습니까? 😉

BEGIN TRANSACTION

IF exists (SELECT * FROM  sys.columns c
INNER JOIN  sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
    BEGIN TRY
        ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
    END TRY
    BEGIN CATCH
        print 'FAILED!'
    END CATCH
ELSE
    BEGIN
        SELECT ERROR_NUMBER() AS ErrorNumber;
        print 'NO TABLE OR COLUMN FOUND !'
    END

COMMIT  


답변

이것에 대한 간단한 대답은 이것을 사용하는 것입니다.

ALTER TABLE MEN DROP COLUMN Lname;

다음과 같이 둘 이상의 열을 지정할 수 있습니다.

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

SQL Server 2016부터는 열이있는 경우에만 열을 삭제할 수 있습니다. 열이 존재하지 않을 때 오류가 발생하지 않아서 신경 쓰지 않아도됩니다.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

열을 삭제하기위한 전제 조건이 있습니다. 삭제 된 열은 다음과 같습니다.

  • 인덱스에서 사용
  • CHECK, FOREIGN KEY, UNIQUE 또는 PRIMARY KEY 제약 조건에서 사용
  • DEFAULT와 연관
  • 규칙에 구속

위의 사항 중 하나라도 해당되는 경우 먼저 해당 연결을 삭제해야합니다.

또한 열을 삭제해도 테이블의 클러스터형 인덱스가 다시 작성 될 때까지 하드 디스크에서 공간을 회수하지 않습니다. 따라서 다음과 같이 테이블 재 구축 명령을 사용하여 위의 내용을 따르는 것이 좋습니다.

ALTER TABLE MEN REBUILD;

마지막으로 일부 사람들이 말했듯이 이것은 느릴 수 있으며 아마도 지속 시간 동안 테이블을 잠글 것입니다. 원하는 구조로 새 테이블을 만들고 다음과 같이 이름을 바꿀 수 있습니다.

SELECT
   Fname
   -- Note LName the column not wanted is not selected
INTO
   new_MEN
FROM
   MEN;

EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';

DROP TABLE old_MEN;

그러나 첫 번째 선택 명령과 마지막 이름 바꾸기 명령 사이에 삽입 된 행의 데이터 손실에 대한 창이 있습니다.