programing

기존 테이블에서 열을 제거하려면 어떻게 해야 합니까?

lastcode 2023. 4. 7. 21:27
반응형

기존 테이블에서 열을 제거하려면 어떻게 해야 합니까?

기존 테이블에서 열을 제거하려면 어떻게 해야 합니까?

테이블이 있습니다MEN와 함께Fname그리고.Lname

를 삭제해야 합니다.Lname

어떻게 하는 거야?

ALTER TABLE MEN DROP COLUMN Lname

범용:

ALTER TABLE table_name DROP COLUMN column_name;

고객님의 경우:

ALTER TABLE MEN DROP COLUMN Lname;

이 예는 단순하고 추가 테이블 변경이 필요하지 않지만 일반적으로 이것은 그리 사소한 것이 아닙니다.

이 열이 다른 테이블에서 참조되는 경우 다른 테이블/컬럼에 대해 수행할 작업을 결정해야 합니다.하나의 옵션은 외부 키를 제거하고 참조된 데이터를 다른 테이블에 보관하는 것입니다.

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

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

정답은 다음과 같습니다.

ALTER TABLE MEN DROP COLUMN Lname

하지만... 만약...CONSTRAINT에 존재합니다.COLUMN, 그럼 당신은 해야 합니다.DROPCONSTRAINT먼저, 그러면 당신은 할 수 있을 것입니다.DROPCOLUMN를 드롭하려면CONSTRAINT, 실행:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

SQL Server 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, FORNE KEY, UNIQURE 또는 Primary KEY 제약에 의해 사용됩니다.
  • 디폴트(DEFAULT)와 관련지어져 있다.
  • 규칙에 얽매이다

위 중 하나에 해당하는 경우 먼저 관련성을 폐기해야 합니다.

또한 열을 삭제해도 테이블의 클러스터된 인덱스가 재구성될 때까지 하드 디스크에서 공간이 회수되지 않습니다.따라서 대부분의 경우 위와 같은 table rebuild 명령어를 사용하는 것이 좋습니다.

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의 새 인스턴스를 만듭니다.그것은 나에게 효과가 있었다.

[column_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

반응형