SQL 열 정의 : 기본값이고 null 중복이 아닙니까?


88

create / alter DDL 문에서 열을 정의하는 다음 구문을 여러 번 보았습니다.

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

질문은 기본값이 지정되었으므로 열이 NULL을 허용하지 않도록 지정해야합니까? 즉, DEFAULT는 NOT NULL 중복을 렌더링하지 않습니까?

답변:


133

DEFAULT삽입 / 업데이트 문에 명시 적 값이없는 경우 삽입 될 값입니다. DDL에 NOT NULL제약 조건 이 없다고 가정 해 보겠습니다.

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT 'MyDefault'

그런 다음 이러한 진술을 발행 할 수 있습니다.

-- 1. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

또한, 당신은 또한 사용할 수 있습니다 DEFAULT에서 UPDATE받는 사람에 따라, 문 SQL-1992 표준 :

-- 5. This will update 'MyDefault' into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

모든 데이터베이스가 이러한 SQL 표준 구문을 모두 지원하는 것은 아닙니다. NOT NULL제약 조건을 추가하면 문에 오류가 발생 4, 6하지만 1-3, 5여전히 유효한 문입니다. 따라서 귀하의 질문에 대답하십시오. 아니요, 중복되지 않습니다.


쿼리 성능에 미치는 엄청난 영향에 대한 설명 (일부 숫자 포함)을보기 위해 귀하의 링크 (블로그 게시물)로 갔지만, 이것이 영향을 미친다는 사실을 잠깐만 다시 확인했습니다. 불쾌하지는 않지만 링크가 약간 오해의 소지가 있습니다.
Seth Flowers

@SethFlowers : 포인터 주셔서 감사합니다, Seth. 링크 된 기사는 그 동안 편집되었습니다. 대신 다른 것을 링크 할 수 있는지 또는 링크를 제거 할 수 있는지 확인합니다. 지금은 절대적으로 옳으며 여기에 대한 답에 어떤 가치도 추가하지 않습니다.
Lukas Eder

고마워요-무례하게 들리지 않았 으면 좋겠어요. 나는 방금 링크를 보았고 "네, 그것은 확실히 내가 읽고 싶은 것입니다"같았습니다-조금 실망했습니다 :).
Seth Flowers

@SethFlowers : 걱정 마세요. 완전히 동의 해. 내 구조에 : 내 블로그의 기술은 크게 :) 지난 몇 년 동안 개선
루카스 에더

19

기본값을 사용하더라도 null.

NOT NULL이 만들어졌습니다 후 제한은 해당 행을 업데이트 할 수 없습니다 null


나는 이것이 다시 표현되어야한다고 생각한다 : "NOT NULL 제한은 그것이 널 값으로 생성 된 후에 그 행을 갱신하도록 허용하지 않을 것이다"물론 NOT NULL 열이있는 행은 갱신 될 수있다. 단지 널로 갱신 될 수 없다. 해당 열의 값입니다. 또한 행을 만드는 것은 행을 삽입하는 것을 의미한다고 가정합니다. INSERT 문은 NOT NULL로 지정된 열에 대해서도 null 값을 가질 수 없습니다.
makrom

4

내 SQL 교사는 당신이 모두 지정하는 경우 말했다 DEFAULT가치를 NOT NULL하거나 NULL, DEFAULT항상 전에 표현해야 NOT NULL하거나 NULL.

이렇게 :

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL


5
안녕하세요, 참여해 주셔서 감사합니다. 그러나 이것은 당면한 질문을 해결하지 못하며 두 순서 모두 완전히 효과적입니다. NULL 및 NOT NULL 값이 더 잘 정렬되기 때문에 수동으로 테이블을 스크립팅 할 때 끝에 기본값을 두는 것이 더 쉽습니다.
emragins

좋아요, 당신도 옳은 것 같아요. 내 과정에서 내가 내 대답에 쓴 내용을 명시 적으로 말하는 이유를 이해하지 못합니다. 내 대답이 실제로 질문을 다루지 않는다는 것을 알고 있지만 주석을 읽을 수 없다는 것을 알았습니다.
Tanguy Labrador Ruiz

3
(주관적) 모범 사례와 규칙에는 차이가 있습니다. 일관된 스타일을 갖는 것은 나쁜 생각이 아니지만,이 특별한 경우에는 개인적으로 DEFAULT보다 NOT NULL을 선호합니다. 어쨌든 답변 대신 댓글을 작성할 수도 있습니다. 이것이 더 적절했을 것입니다.
makrom

그것은 아마도 질문에 대답하지 않을 것입니다. 하지만 그것이 바로 제가 찾던 것입니다. 감사합니다.
Sasuke Uchiha

2

나는 말하지 않을 것이다.

열이 null 값을 허용하는 경우 필드에 null 값을 삽입하는 것을 중지 할 방법이 없습니다. 내가 아는 한 기본값은 새 행 생성에만 적용됩니다.

null이 설정되지 않은 경우 오류가 발생하므로 필드에 null 값을 삽입 할 수 없습니다.

널을 방지하기위한 페일 세이프 메커니즘으로 생각하십시오.


2
당신은 '새로운 규칙의 창조'라고 말했습니다. '새 행 만들기'라고 말하려고 하셨나요?
bielawski

나는 이것이이 질문에 대한 더 실용적인 대답이라고 생각합니다.
Noman_ibrahim

@bielawski 그리고 거의 팔년 후, 나는 :) 그 오타를 수정 주위에 얻을
다크 하마

이것은 받아 들여진 대답이어야합니다. OP는 간단한 질문을하고 대답은 단순히 "아니오"입니다. 그러나 문서화에는 설명과 예가 필요합니다.
Nicolas Hevia

0

즉, DEFAULT는 NOT NULL 중복을 렌더링하지 않습니까?

아니요, 중복되지 않습니다. 수락 된 답변을 확장합니다. colnullable awe 인 열의 경우 DEFAULT가 정의 된 경우에도 NULL을 삽입 할 수 있습니다.

CREATE TABLE t(id INT PRIMARY KEY, col INT DEFAULT 10);

-- we just inserted NULL into column with DEFAULT
INSERT INTO t(id, col) VALUES(1, NULL);

+-----+------+
| ID  | COL  |
+-----+------+
|   1 | null |
+-----+------+

Oracle은 이러한 시나리오에 대한 추가 구문을 도입하여 명시 적 NULL을 기본값으로 덮어 씁니다 DEFAULT ON NULL.

CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10);
-- same as
--CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10 NOT NULL); 

INSERT INTO t2(id, col) VALUES(1, NULL);

+-----+-----+
| ID  | COL |
+-----+-----+
|  1  |  10 |
+-----+-----+

여기서는 NULL을 삽입하려고했지만 대신 기본값을 얻었습니다.

db <> 바이올린 데모

ON NULL

ON NULL 절을 지정하면 Oracle Database는 후속 INSERT 문이 NULL로 평가되는 값을 할당하려고 할 때 DEFAULT 열 값을 할당합니다.

ON NULL을 지정하면 NOT NULL 제약 조건 및 NOT DEFERRABLE 제약 조건이 암시 적으로 지정됩니다.

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