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


198

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

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


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.