create / alter DDL 문에서 열을 정의하는 다음 구문을 여러 번 보았습니다.
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
질문은 기본값이 지정되었으므로 열이 NULL을 허용하지 않도록 지정해야합니까? 즉, DEFAULT는 NOT NULL 중복을 렌더링하지 않습니까?
답변:
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
여전히 유효한 문입니다. 따라서 귀하의 질문에 대답하십시오. 아니요, 중복되지 않습니다.
기본값을 사용하더라도 null
.
NOT NULL
이 만들어졌습니다 후 제한은 해당 행을 업데이트 할 수 없습니다 null
값
내 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
나는 말하지 않을 것이다.
열이 null 값을 허용하는 경우 필드에 null 값을 삽입하는 것을 중지 할 방법이 없습니다. 내가 아는 한 기본값은 새 행 생성에만 적용됩니다.
null이 설정되지 않은 경우 오류가 발생하므로 필드에 null 값을 삽입 할 수 없습니다.
널을 방지하기위한 페일 세이프 메커니즘으로 생각하십시오.
즉, DEFAULT는 NOT NULL 중복을 렌더링하지 않습니까?
아니요, 중복되지 않습니다. 수락 된 답변을 확장합니다. col
nullable 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을 삽입하려고했지만 대신 기본값을 얻었습니다.
ON NULL 절을 지정하면 Oracle Database는 후속 INSERT 문이 NULL로 평가되는 값을 할당하려고 할 때 DEFAULT 열 값을 할당합니다.
ON NULL을 지정하면 NOT NULL 제약 조건 및 NOT DEFERRABLE 제약 조건이 암시 적으로 지정됩니다.