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


답변:



157

일반적인:

ALTER TABLE table_name DROP COLUMN column_name;

귀하의 경우 :

ALTER TABLE MEN DROP COLUMN Lname;

72

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

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

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

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


47

이것이 정답입니다.

ALTER TABLE MEN DROP COLUMN Lname

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

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE tb_name DROP FOREIGN KEY key_name
bortunac

3
열을 검색 constraint하는 방법 ?
Kiquenet

21

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

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

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


3
DIE 문장은 무엇입니까 ?
Kiquenet

3
그건 그렇고, 당신은 "다시 실행 가능한"스크립트 / 기능 이러한 유형의 호출 할 수 있습니다 멱등 원 (冪等元)을
tomosius

4
이것이 정답이어야합니다. SQL 스크립트 배포를 자동화 한 경우 이와 같이 스크립트를 방어 적으로 작성해야합니다.
빅터

7

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

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  

1
나는 당신이 존재하지 않는 테이블에서 열을 삭제하려고한다면, 이것이 그렇게하는 방법 일 것입니다
Matiaan

6

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

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;

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


2

기존 테이블에 열을 추가하려면

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

기존 테이블에서 열을 삭제하려면 다음을 수행하십시오.

ALTER TABLE table_name
DROP COLUMN column_name

ADD 열에 대한 질문이 아닙니다 .
Kiquenet

2

이것은 SSMS GUI를 통해서도 가능합니다. 이 방법의 좋은 점은 해당 열에 관계가 있으면 경고하고 자동으로 삭제할 수도 있다는 것입니다.

  1. 다음과 같이 디자인 뷰에 테이블을 놓습니다 (테이블을 마우스 오른쪽 버튼으로 클릭).

여기에 이미지 설명을 입력하십시오

  1. 테이블의 디자인 뷰에서 열을 마우스 오른쪽 버튼으로 클릭하고 "열 삭제"를 클릭하십시오.

여기에 이미지 설명을 입력하십시오

앞에서도 언급했듯이, 삭제해야 할 관계가있는 경우이 시점에서도 관계를 삭제할 것인지 묻습니다. 열을 삭제하려면 그렇게해야합니다.


0

C #을 사용하고 Identity 열이 int이면 값을 제공하지 않고 int의 새 인스턴스를 만듭니다.

[identity_column] = 새로운 int ()


이 답변은 무엇을합니까? 테이블에서 열을 제거합니까?
Prashant Pimpale

0

통사론:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

예를 들어 :

alter table Employee drop column address;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.