데이터 손실없이 SQL 데이터베이스에서 열 데이터 유형을 변경하는 방법


198

나는 SQL Server 데이터베이스가 있고 난 그냥에서 열 중 하나의 유형을 변경할 수 있습니다 실현 int에 bool.

해당 테이블에 이미 입력 된 데이터를 잃지 않고 어떻게 할 수 있습니까?


3
새 비트 열을 작성하고 이전 열의 값을 새 열로 복사하고 이전 열을 삭제하고 새 이름을 바꾸려고 시도 했습니까? 물론 트랜잭션에서이 모든 문제를 롤백합니다.
— Radu Caprescu

2
"방금 열 중 하나에서 int에서 bool로 유형을 변경할 수 있다는 것을 깨달았습니다."부울 데이터 유형이 없습니다. 그래도 조금 있습니다. (지금까지 2 답변이 다룬 것처럼) 어떻게 할 수 있는지 묻고 있습니까? 아니면 당신의 질문은 "이것이 가능하다는 것을 깨달았습니다 -SQL Server 는 어떻게 합니까?"
— Martin Smith

답변:


329

다음 명령을 사용하여이 작업을 쉽게 수행 할 수 있습니다. 0의 값은 0 (BIT = false)으로 바뀌고 다른 값은 1 (BIT = true)로 바뀝니다.

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

다른 옵션은 유형의 새 열을 만들고 BIT이전 열에서 채우고, 완료되면 이전 열을 삭제하고 새 열의 이름을 이전 이름으로 바꾸는 것입니다. 이렇게하면 변환 중 무언가 잘못되면 여전히 모든 데이터를 가지고 있기 때문에 언제든지 되돌아 갈 수 있습니다.


10
다른 말로 : NULL남아 NULL, 0하게 False, 비 - 제로 값 (1, -1, 1999, -987은 ...)가 True.
— Álvaro González

2
GUI에서 이와 같이 변경하지 마십시오. 항상 이와 같은 스크립트를 통해 작성하십시오. GUI는 테이블을 삭제하고 다시 작성하므로 시간이 훨씬 많이 걸립니다. 테이블이 크고 생산중인 경우 이는 비참 할 수 있습니다. 또한 모든 테이블 변경에는 다른 모든 코드와 같이 소스 제어에있는 스크립트가 있어야합니다.
— HLGEM

1
데이터가있는 테이블을 구조적으로 변경하기 전에 데이터베이스의 현재 백업이 있는지 확인하십시오. 테이블을 자주 사용하거나 많이 사용하는 경우 사용량이 가장 많은 시간 동안 프로덕션에서 이와 같이 변경하지 마십시오.
— HLGEM

수정 사항을 잘못 승인했습니다. 거부해야합니다. 개선이 없었기 때문에 ... Ans is perfact.
— Vikash Pathak

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

참고 : 열 크기가 있으면 크기도 쓰십시오.


20

유효한 변경 인 경우

속성을 변경할 수 있습니다.

도구-> 옵션-> 디자이너-> 테이블 및 데이터베이스 디자이너-> 선택 취소-> 테이블 재 작성에 필요한 변경 사항 저장 방지.

이제 테이블을 다시 만들거나 ur 레코드를 잃지 않고도 열 이름을 쉽게 변경할 수 있습니다.


5
어떠한 상황에서도 GUI를 사용하여 테이블을 변경해서는 안됩니다. 변경 테이블을 사용하지 않고 테이블을 완전히 다시 작성하므로이 테이블을 선택 취소하고 테이블이 큰 경우 문제가 발생합니다. 또한 소스 제어의 스크립트에서 테이블에 대한 모든 변경 사항이 있어야합니다.
— HLGEM

해당 옵션을 자세히 살펴보십시오. 안전을 해제하여 GUI가 테이블을 삭제하지 못하게합니다. GUI가 테이블을 다시 작성하기 때문에 데이터가 손실 되지 않는 것처럼 보이지만 서버에서는 복사 / 삭제됩니다. 따라서 테이블에 많은 데이터가 있으면 매우 큰 작업이 발생합니다. 또한 단일 트랜잭션에서 발생 한다고 생각 하므로 긍정적이지 않으므로 트랜잭션 로그를 채울 수 있습니다.
— JMarsch

1
이전 의견에 약간의 설명을 추가하고 싶습니다. 개발 머신에서이 작업을 수행하는 경우 문제가 없습니다. 그러나 프로덕션 데이터베이스에서이 방법을 사용하지 않는 것이 좋습니다. 특히 업무상 중요한 데이터베이스 인 경우에는 더욱 그렇습니다.
— JMarsch

8

왜 데이터가 손실 될 것이라고 생각하십니까? 간단히 Management Studio로 이동하여 데이터 유형을 변경하십시오. 기존 값을 부울 (비트)로 변환 할 수 있으면 그렇게됩니다. 다시 말해, 원래 필드에서 "1"이 true로 매핑되고 "0"이 false로 매핑되면 문제가 없습니다.


1
테이블에 데이터가 있으면 작동하지 않습니다. 열 유형을 변경하려고 시도 할 때 SMS는 먼저 테이블을 삭제해야한다고 주장합니다. 물론 ALTER TABLE ... ALTER COLUMN 명령은 NULL이 아닌 필드에서도 제대로 작동하기 때문에 올바르지 않습니다. 이것이 그들이 데이터를 잃을 수 있다고 생각한 이유입니다.
— Tony O'Hagan

1
@ TonyO'Hagan 사실이 아닙니다. 경고를 끌 수 있으며 기존 데이터와 잘 작동합니다. 또한 참조 stackoverflow.com/questions/2947865/...
— 필립 Leybaert에게

1
그래요 좋아요! 몰랐어요 방금 투표를하려고했지만 답변을 편집하지 않으면 SO가 나를 막습니다. 아마도 사소한 변경 일 수 있습니다.
— Tony O'Hagan

1
어떠한 상황에서도 GUI를 사용하여 테이블을 변경해서는 안됩니다. 변경 테이블을 사용하지 않고 테이블을 완전히 다시 작성하므로이 테이블을 선택 취소하고 테이블이 큰 경우 문제가 발생합니다. 또한 소스 제어의 스크립트에서 테이블에 대한 모든 변경 사항이 있어야합니다.
— HLGEM

어떠한 상황에서도 GUI를 사용하여 테이블을 디자인하거나 변경해야 할 이유가 없으며 그렇게하지 않는 좋은 이유가 있습니다. 모든 변경 사항은 다른 서버로 전파하고 실제로 소스 제어에있는 코드처럼 처리하려면 스크립트에 있어야합니다.
— HLGEM

5

T-SQL (MSSQL)을 사용하는 경우; 이 스크립트를 시도해야합니다.

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

MySQL을 사용한다면; 이 스크립트를 시도해야합니다.

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

Oracle을 사용하는 경우 이 스크립트를 시도해야합니다.

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

도구 옵션 디자이너-테이블 및 데이터베이스 디자이너로 이동하여 저장 방지 옵션을 선택 취소하십시오.여기에 이미지 설명을 입력하십시오


1
어떠한 상황에서도 GUI를 사용하여 테이블을 변경해서는 안됩니다. 변경 테이블을 사용하지 않고 테이블을 완전히 다시 작성하므로이 테이블을 선택 취소하고 테이블이 큰 경우 문제가 발생합니다. 또한 소스 제어의 스크립트에서 테이블에 대한 모든 변경 사항이 있어야합니다.
— HLGEM

2

확인 유형의 열로 열 데이터 유형 변경 :

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

나를 위해, SQL Server 2016에서 다음과 같이합니다.

* 열 1을 열 2로 이름을 바꾸려면

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* 열 유형을 문자열 에서 int로 수정하려면 :( 데이터가 올바른 형식인지 확인하십시오 )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

컴팩트 에디션에서는 날짜 시간 데이터 유형 (8)의 크기를 자동으로 가져 오기 때문에 필드 크기를 설정 하고이 작업에 오류가 발생할 필요가 없습니다 ...


-2

다음 쿼리를 사용하여 테이블 필드의 데이터 유형을 수정할 수 있습니다.

ALTER TABLE table_name
MODIFY column_name datatype;

SQl 서버에 없음
— HLGEM

-4

데이터 손실없이 데이터 유형 교체

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