1085

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

나는특정 SQL 구문열을 변경하려면ColumnA)를 "not null"데이터가 null을 포함하지 않도록 업데이트되었다고 가정합니다.

사용SQL 서버 2000.


  • 한 가지 다른 점은 - 열을 지정하지 않는 기존 삽입이 실패하지 않도록 기본값을 추가하는 것입니다. ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_DEFault DEFAULT 0 FOR Bar - Marc Gravell
  • 또한 그 사실을 알고 놀랄 수도 있습니다.어떤 상황에서는열을NOT NULL많은 로깅을 유발할 수 있습니다. - Martin Smith

12 답변


1809

먼저 모든 현재 NULL 값을 사라지게합니다.

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

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

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


  • 위의 두 가지 올바른 응답에 부가 가치를 부여하겠습니다. NULL의 의미에는 몇 가지 의미가있을 수 있습니다. 일반적인 의미 중 하나는 UNKNOWN입니다. SCORE를 예로 들어 보겠습니다. null 점수와 0 점은 차이점입니다. 위의 권장 사항을 수행하기 전에 응용 프로그램이 비즈니스 논리에서 null을 갖지 않도록하십시오. - TechTravelThink
  • 오타를 만들고 DB가 폭발 할 경우를 대비하여 데이터베이스를 먼저 백업하십시오. - mpen
  • 그것의 이상한 MS SQL Management Studio는 그 옵션을 허용하지 않는다. & quot; Dropping table ... & quot;에 대해 자랑 스럽다. - Sebastian
  • 데이터베이스는 항상 백업해야합니다. 사람들 중 한 사람이 언제 문장을 작성하고 UPDATE 또는 DELETE하고 WHERE 절을 잊어 버리는 지 결코 알 수 없습니다. - Daniel Allen Langdon
  • @SebastianGodelet : 경고를 끄거나 테이블을 수정하지 못하도록 설정할 수있는 설정이 있습니다. 경우에 따라 테이블의 스키마를 변경하려면 새 테이블을 만들고 이전 테이블과 이전 테이블에서 복사 한 데이터를 삭제해야합니다. 이 프로세스의 오류로 인해 데이터가 손실 될 수 있으므로 SSMS에서 경고하고 기본적으로 수행하지 못하게합니다. - siride

49

나도 같은 문제가 있었지만, null로 기본값을 사용하는 필드는 이제 0으로 기본값을 지정하고 싶습니다. mdb의 해결책을 한 번 더 추가해야했습니다.

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


  • 이것으로는 문제에 답할 수 없습니다. 기본값은 이미 설정되어 있으므로 변경할 필요가있는 NOT NULL입니다. 답을 통해서만 기존 레코드가 모두 NULL로 유지되고 문제가 해결됩니다. - PandaWood
  • & quot; 한 줄 더 추가 & quot;에 대한 부분을 읽었습니까? 에서와 마찬가지로, 이것은 위의 답변에 추가됩니까? - Greg Dougherty
  • 사실, & quot; 한 줄 더 추가 & quot;라는 명확한 정보는 없습니다. 「상기의 답에 더하여」란, (특히 위에있는 답변이 많기 때문에) - 그 내용이 무엇인지 알기 원하면 단어를 변경해야하며 참조 할 답변의 줄을 포함해야합니다. - PandaWood
  • 차임에 들어가서 제약 조건을 명시 적으로 지정하는 것이 좋습니다. 기본값은 포함되어 있습니다. 열을 삭제해야하는 경우 삭제하기 전에 삭제해야하는 제약 조건의 이름을 알아야합니다. 우리의 DB 마이그레이션에서 몇 차례이 작업을 수행하십시오. 여기에 예제가 포함되어 있다는 것을 알고 있지만 이름이 필요하지 않으므로 일부 개발자는 여전히 올라가는 곳입니다. - jocull

32

당신은 두 단계로 그것을해야 할 것입니다 :

  1. 컬럼에 널 (null)이 없도록 테이블을 갱신하십시오.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. 열을 변경하려면 테이블을 변경하십시오.
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL


22

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

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

그렇지 않으면 abatichev의 대답은 좋게 보였다. 변경을 반복 할 수 없다 - 적어도 SQL Developer에서는 열이 이미 널이 아님을 불평한다.


  • 오라클 11에서는 다음을 반복하지 않아도됩니다.datatype. 단지columname NOT NULL충분하다. 만나다문서. - jpmc26

17

이것은 나를 위해 일했다 :

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


16

열이 고유 한 식별자가 아닌 한

UPDATE table set columnName = 0 where columnName is null

그때

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


5

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

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

또한이를 사용하여 열을 추가 할 수 있습니다. 값이 널인 경우,이 예에서 기본값 (0)으로 갱신됩니다.



3

제 경우에는 게시 된 답변에 어려움이있었습니다. 나는 다음과 같이 사용했다.

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

변화VARCHAR(200)데이터 유형을 선택하고 선택적으로 기본값을 변경하십시오.

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


2

의 경우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)

STEP3 :

이 코드를 사용하여 모든 제약 조건을 활성화합니다.

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


1

열을 null이 아니게 만들고 기본값을 추가하는 작업은 SSMS GUI에서도 수행 할 수 있습니다.

  1. 다른 사람들이 이미 말했듯이, 당신은 "not null"을 설정할 수 없습니다. 기존 데이터는 다음과 같이 "not null"입니다.

UPDATE myTable SET myColumn = 0

  1. 완료되면 테이블을 디자인보기 (오른쪽 클릭 테이블을 클릭하고 "디자인보기"를 클릭),허용 널다음과 같은 열 :

enter image description here

  1. 선택한 열이있는 디자인 뷰에서 여전히열 속성아래의 창에서 기본값을 0으로 설정하십시오.

enter image description here


0

JDK에 포함 된 inbuilt javaDB (오라클이 지원하는 Apache Derby 배포판)의 경우 아래 내용이 나에게 유용했다.

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


0

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

ALTER TABLE mytable modify mycolumn datatype NOT NULL;

연결된 질문


관련된 질문

최근 질문