development

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

big-blog 2020. 2. 26. 07:57
반응형

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


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

나는 테이블 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;

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


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

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

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

ALTER TABLE table_name
DROP COLUMN column_name

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

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

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

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

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

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


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

[identity_column] = 새로운 int ()


통사론:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

예를 들어 :

alter table Employee drop column address;

참고 URL : https://stackoverflow.com/questions/5626344/how-to-remove-a-column-from-an-existing-table



반응형