열 변경 : null ~ not null


1216

nullable 정수 열이 여러 개인 테이블이 있습니다. 이것은 여러 가지 이유로 바람직하지 않으므로 모든 null을 0으로 업데이트 한 다음이 열을로 설정하려고 NOT NULL합니다. null을로 변경하는 것 외에도 0데이터를 보존해야합니다.

열 을 " " 로 변경 하기 위해 특정 SQL 구문 을 찾고 있습니다. 널을 포함하지 않도록 데이터가 갱신되었다고 가정하십시오.ColumnAnot null

사용하여 SQL 서버 2000 .


16
다른 한 가지-열을 지정하지 않는 기존 삽입물이 실패하지 않도록 기본값을 추가 할 수 있습니다. ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell

4
또한 어떤 상황 에서는 열을 변경 NOT NULL하여 많은 로깅을 유발할 수 있다는 사실에 놀랄 수도 있습니다 .
Martin Smith

답변:


2011

먼저 모든 현재 NULL값을 사라지게하십시오.

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

그런 다음 "NULLs"를 허용하지 않도록 테이블 정의를 업데이트하십시오.

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

49
위의 두 가지 올바른 답변에 가치를 더하겠습니다. NULL의 의미는 몇 가지 의미를 가질 수 있습니다. 일반적인 의미 중 하나는 알 수 없음입니다. 예를 들어 점수를 보자. 널 점수와 영점은 차이의 세계입니다! 위의 권장 사항을 수행하기 전에. 비즈니스 논리에서 응용 프로그램이 널 (null)을 사용하지 않도록하십시오.
TechTravelThink

242
오타가 발생하고 DB가 폭발하는 경우를 대비하여 먼저 데이터베이스를 백업하십시오.
mpen

20
MS SQL Management Studio가이 옵션을 허용하지 않는 것이 이상합니다. "Dropping table ..."에 대해 자랑합니다
Sebastian

14
데이터베이스는 항상 백업해야합니다. 직원 중 한 명이 언제 UPDATE 또는 DELETE 문을 작성하고 WHERE 절을 잊었는지 알 수 없습니다.
Vivian River

2
@SebastianGodelet : 경고를 끄거나 테이블을 수정하지 못하게하는 설정이 있습니다. 경우에 따라 테이블의 스키마를 변경하려면 새 테이블을 작성하고 이전 테이블과 이전 테이블에서 복사 한 데이터를 삭제해야합니다. 이 과정에서 오류가 발생하면 데이터가 손실 될 수 있으므로 SSMS는 경고를 표시하고 기본적으로이를 수행하지 못하게합니다.
siride

57

나는 같은 문제가 있었지만 필드는 기본적으로 null로 설정되었고 이제는 0으로 기본값을 설정하려고합니다. mdb의 솔루션 뒤에 한 줄을 더 추가해야했습니다.

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

이것은 문제에 대한 답변이 아닙니다. 기본값은 이미 설정되어 있으며 변경해야 할 NOT NULL입니다. 귀하의 답변 만 있으면 기존의 모든 레코드는 NULL로 유지되며 문제는 남아 있습니다.
PandaWood

6
"한 줄 더 추가"에 대한 부분을 읽었습니까? 에서와 같이 위의 답변에 추가됩니까?
Greg Dougherty

7
실제로 "한 줄 더 추가"가 "위의 답변 외에"를 의미한다는 것은 확실하지 않습니다 (특히 위의 답변이 많기 때문에). 귀하가 참조하는 답변을 포함 시키십시오
PandaWood

2
차임하기를 원했고 제약 조건의 이름을 명시 적으로 지정하는 것이 좋습니다 (기본값 포함). 열을 삭제해야 할 경우 삭제하기 전에 삭제해야 할 구속 조건의 이름을 알아야합니다. DB 마이그레이션에서이 문제를 몇 차례 해결했습니다. 나는 예제가 여기에 포함되어 있다는 것을 알고 있지만 이름이 필요하지 않기 때문에 여전히 일부 개발자들이 여행하는 곳입니다.
jocull

38

다음 두 단계로 수행해야합니다.

  1. 열에 널이 없도록 테이블을 업데이트하십시오.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. 테이블의 속성을 변경하여 열 속성 변경
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

Oracle 11g의 경우 다음과 같이 열 속성을 변경할 수있었습니다.

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

그렇지 않으면 abatichev의 대답은 좋았습니다. 변경을 반복 할 수 없습니다-적어도 SQL Developer에서는 열이 이미 null이 아니라고 불평합니다.


Oracle 11에서는을 반복하지 않아도됩니다 datatype. 단순히 columname NOT NULL충분하다. 설명서를 참조하십시오 .
jpmc26 2016 년

18

이것은 나를 위해 일했다 :

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;

16

열이 고유 식별자가 아닌 한

UPDATE table set columnName = 0 where columnName is null

그때

테이블을 변경하고 필드를 널이 아닌 값으로 설정하고 기본값 0을 지정하십시오.


4

이것은 더 단순 해 보이지만 Oracle에서만 작동합니다.

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

또한이를 통해 열을 변경하는 것만이 아니라 열을 추가 할 수도 있습니다. 이 예에서는 값이 null 인 경우 기본값 (0)으로 업데이트됩니다.


그렇습니다. 그러나 구글은 사람들을 여기로 안내합니다. 유용하다고 생각합니다. 누구나 이것을 무시할 수는 있지만 솔직히 이것이 사람들을 돕고 있다고 생각합니다.
csomakk

SO 규칙을 읽으십시오. 좋은 답변을 쓰려면 어떻게해야합니까? , ANSWERING TECHNICAL QUESTIONS 도움이 되고 완벽한 질문을 작성하십시오 . 참고 : 할 일이 (많이 또는 편집) 쓸모없는 답변 삭제하는 것을 두려워하지하지 "대답하고 실행
Kiquenet

4

FOREIGN KEY CONSTRAINT...의 경우 기본 키 테이블의 열에 '0'이 없으면 문제가 발생합니다. 그 해결책은 ...

1 단계:

이 코드를 사용하여 모든 제약 조건을 비활성화하십시오.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

2 단계:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

3 단계 :

이 코드를 사용하여 모든 제약 조건을 활성화하십시오.

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

4

제 경우에는 게시 된 답변에 어려움이있었습니다. 나는 다음을 사용하여 끝났다.

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

변경 VARCHAR(200)당신의 데이터 형, 선택적 디폴트 값을 변경합니다.

기본값이 없으면 충돌을 일으키는 기본 값이 null이므로이 변경을 수행하는 데 문제가 있습니다.


1

예를 들어 보자.

TABLE NAME=EMPLOYEE

그리고 열 EMPLOYEE_NAME을 로 변경하고 싶습니다 NOT NULL. 이 쿼리는 작업에 사용할 수 있습니다.

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

더 읽기 쉽게 게시하기 위해 소리를 지르지 말고 형식을 사용하십시오. 예를 들어 코드 부분을 인식하는 데 도움이됩니다. stackoverflow.com/editing-help
Yunnosch 2016

또한 대문자로 긴 텍스트를 쓰지 마십시오. 인터넷에서 소리 치는 것으로 간주됩니다
Zoe

1
@PawanTiwari 전체를 수정하십시오. 게시물의 모든 문제를 해결하지 않은 것 같습니다. 그것의 대부분은 대문자입니다.
double-beep

@ double-beep, 물론 나는 그것을 명심할 것이다. 감사합니다
Pawan Tiwari

형식 문제 외에도 Ralph Wiggum, JDM, Rashmi Singh 및 trooper31의 이전 답변과 비교할 때 답변이 제공하는 추가 통찰력을 더 명확하게 설명하십시오. 따라서 솔루션의 더 좋은 점을 지적해야합니다. 답을 복사하는 것의 인상을 피하십시오 ...
Yunnosch

0

JDK (Oracle에서 지원하는 Apache Derby 배포판)에 포함 된 내장 JavaDB의 경우 아래가 나를 위해 일했습니다.

alter table [table name] alter column [column name] not null;

0

SSMS GUI에서 열을 null로 설정하지 않고 기본값을 추가 할 수도 있습니다.

  1. 다른 사람들이 이미 언급했듯이 기존 데이터가 모두 "널이 아님"이 될 때까지 "널이 아님"을 설정할 수 없습니다.

UPDATE myTable SET myColumn = 0

  1. 완료되면 테이블을 디자인보기에 놓고 (테이블을 마우스 오른쪽 단추로 클릭하고 "디자인보기"를 클릭) 다음 과 같이 Null 허용 열을 선택 취소하면됩니다 .

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

  1. 열이 선택된 디자인보기 에서 아래 창에 열 속성 이 표시되고 여기에서 기본값을 0으로 설정할 수 있습니다.

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


downvote가 표시되지만 피드백 없이는 아무것도 수정할 수 없습니다. 문제가 발생하면 알려주십시오.
Tony L.

-1

다음 sql을 사용하여 기존 DB 열의 정의를 변경할 수 있습니다.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.