기존 테이블에 NOT NULL 열 삽입


121

나는 시도했다 :

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

그러나 다음과 같은 오류 메시지가 표시됩니다.

ALTER TABLE은 널을 포함하거나 DEFAULT 정의가 지정된 열만 추가 할 수 있도록 허용합니다.

답변:


222

옵션으로 처음에 Null 허용 열을 만든 다음 유효한 null이 아닌 값으로 테이블 열을 업데이트하고 마지막으로 ALTER 열을 업데이트하여 NOT NULL 제약 조건을 설정할 수 있습니다.

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

또 다른 옵션은 열에 올바른 기본값을 지정하는 것입니다.

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD : 위의 답변에는 GOMicrosoft SQL 서버에서이 코드를 실행할 때 필수 항목이 포함되어 있습니다 . Oracle 또는 MySQL에서 동일한 작업을 수행하려면 다음과 같은 세미콜론을 사용해야 ;합니다.

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

1
필드에 수동으로 입력 할 수있는 값이있는 경우 여기에서 첫 번째 방법을 개인적으로 선호합니다. 이렇게하면 필요하지 않은 기본 제약 조건을 만들고 삭제하는 것에 대해 걱정할 필요가 없습니다.
Mark W Dickson

1
@acarlon-나는 그것이 도달하고 있다고 생각합니다. update언급 한 위험한 진술은 모든 쿼리에서 해로울 수 있습니다. update여기 문에 추가 열이 있는지 확인하는 것은 간단해야합니다 . 일반적으로 한 번에 한 두 개의 열만 추가합니다. update이 예에서 여기에 속하지 않는 추가 열을 명세서에 추가 하면 처음부터 데이터를 담당해서는 안됩니다.
Mark W Dickson

1
SQLite를 사용하는 ANDROID 개발자 ALTER COLUMN는 SQLite에서 지원되지 않음을 알고 있어야합니다 .
Sdghasemi

2
나는 GO전에 본 적이 없으며 SQL 사양의 일부아닌 것처럼 보이 므로 스크립트를 지원하는 도구 중 하나에서 실행되지 않는 스크립트로 인해 실패 할 수 있습니다. 세미콜론 만 사용 하시겠습니까? Microsoft 표준을 널리 알리는 것은 권장하지 않습니다. 그들은 확립되고 합리적인 표준을 거의 신경 쓰지 않고 자체적으로 발명하기 위해 자체적으로 발명합니다. 그 외에도 유용한 답변입니다.
Neonit

2
@Neon은 의견을 보내 주셔서 감사하지만 원래 질문은 MS SQL 서버에 관한 것이기 때문에 GO가 있습니다. 그러나 나는 그것에 대한 메모를 내 대답에 추가 할 것입니다.
Pavel Morshenyuk

13

열이 Null이되도록 허용하지 않는 경우 기존 행을 채우기위한 기본값을 제공해야합니다. 예 :

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

Enterprise Edition에서는 2012 년 이후 메타 데이터 만 변경 되었습니다.


2
그럴 필요 는 없지만 하나의 옵션입니다.
매트

6

오류 메시지는 매우 설명 적입니다.

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

그리고 기본 부분에서 "빼기"의 의미는 무엇입니까?
Mladen B.

3

다른 SQL 구현에도 유사한 제한이 있습니다. 그 이유는 열을 추가하려면 해당 열에 대한 값을 추가해야하므로 (물리적으로는 아니더라도 논리적으로) 기본값은 NULL. 허용 NULL하지 않고가없는 경우 default값은 무엇입니까?

SQL Server가를 지원하므로 ADD CONSTRAINTPavel의 nullable 열을 만든 다음 비값으로 NOT NULL채운 후 제약 조건 을 추가하는 것이 좋습니다 NULL.


MySQL은 데이터가있는 기존 테이블에 null이 아닌 열을 추가하는 것을 지원합니다. 여기서 데이터 유형에 대한 "적당한"빈 값이 기존 행에 제공됩니다 (예 : float의 경우 0.0, 정수의 경우 0, 문자열의 경우 빈 문자열 등).
Michael Tsang

2

이것은 나를 위해 일했고, 또한 디자인 뷰에서 "빌려", 변경-> 마우스 오른쪽 버튼 클릭-> 변경 스크립트 생성.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT

1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;

0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

1
이 답변은이 주제에 무엇을 추가합니까?
barbsan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.