Loading...
MySQL 9.5 Reference Manual 9.5의 13.6 Data Type Default Values의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Data type 지정은 명시적 또는 암시적 default value를 가질 수 있습니다.
Data type 지정의 DEFAULT value 절은 컬럼에 대한 default value를 명시적으로 나타냅니다. 예시는 다음과 같습니다:
1CREATE TABLE t1 ( 2 i INT DEFAULT -1, 3 c VARCHAR(10) DEFAULT '', 4 price DOUBLE(16,2) DEFAULT 0.00 5);
SERIAL DEFAULT VALUE는 특별한 경우입니다. integer 컬럼 정의에서 이는 NOT NULL AUTO_INCREMENT UNIQUE의 별칭(alias)입니다.
명시적 DEFAULT 절 처리의 일부 측면은 다음에서 설명하는 것처럼 버전 의존적입니다.
DEFAULT 절에 지정된 default value는 리터럴 상수 또는 expression이 될 수 있습니다. 한 가지 예외를 제외하고, expression default value는 리터럴 상수 default value와 구분하기 위해 괄호로 둘러싸야 합니다. 예시는 다음과 같습니다:
1CREATE TABLE t1 ( 2 -- literal defaults 3 i INT DEFAULT 0, 4 c VARCHAR(10) DEFAULT '', 5 -- expression defaults 6 f FLOAT DEFAULT (RAND() * RAND()), 7 b BINARY(16) DEFAULT (UUID_TO_BIN(UUID())), 8 d DATE DEFAULT (CURRENT_DATE + INTERVAL 1 YEAR), 9 p POINT DEFAULT (Point(0,0)), 10 j JSON DEFAULT (JSON_ARRAY()) 11);
예외는 TIMESTAMP 및 DATETIME 컬럼의 경우입니다. 이 컬럼들에 대해서는, default로서 CURRENT_TIMESTAMP 함수를 괄호 없이 지정할 수 있습니다. Section 13.2.5, “Automatic Initialization and Updating for TIMESTAMP and DATETIME”를 참조하십시오.
BLOB, TEXT, GEOMETRY, 그리고 JSON data type은, expression으로 작성된 경우에만 default value를 지정할 수 있습니다. 이는 expression value가 리터럴인 경우에도 마찬가지입니다:
1CREATE TABLE t2 (b BLOB DEFAULT ('abc'));
1CREATE TABLE t2 (b BLOB DEFAULT 'abc');
Expression default value는 다음 규칙을 따라야 합니다. Expression에 허용되지 않는 구문이 포함되어 있으면 에러가 발생합니다.
리터럴, 내장 함수(결정론적 및 비결정론적 모두), 그리고 연산자는 허용됩니다.
서브쿼리, 파라미터, 변수, 저장 함수, 로더블 함수는 허용되지 않습니다.
Expression default value는 AUTO_INCREMENT 속성을 가진 컬럼에 의존할 수 없습니다.
하나의 컬럼에 대한 expression default value는 다른 테이블 컬럼을 참조할 수 있지만, generated column 또는 expression default value를 가진 컬럼에 대한 참조는 테이블 정의에서 더 먼저 나타나는 컬럼에 대해서만 허용됩니다. 즉, expression default value에는 generated column 또는 expression default value를 가진 컬럼에 대한 forward reference가 포함될 수 없습니다.
이 순서 제약은 ALTER TABLE을 사용하여 테이블 컬럼의 순서를 변경하는 경우에도 적용됩니다. 결과 테이블에 expression default value가 forward reference를 포함하는 generated column 또는 expression default value를 가진 컬럼이 존재하게 되면, statement는 실패합니다.
참고
Expression default value의 어떤 구성 요소라도 SQL mode에 의존하는 경우, 테이블 사용 시마다 SQL mode가 동일하지 않다면 각 사용에서 서로 다른 결과가 발생할 수 있습니다.
CREATE TABLE ... LIKE 및 CREATE TABLE ... SELECT의 경우, 대상 테이블은 원본 테이블의 expression default value를 유지합니다.
Expression default value가 비결정론적 함수를 참조하는 경우, expression의 평가를 야기하는 statement는 statement-based replication에 대해 unsafe합니다. 여기에는 INSERT 및 UPDATE와 같은 statement가 포함됩니다. 이 상황에서 binary logging이 비활성화되어 있으면, statement는 정상적으로 실행됩니다. Binary logging이 활성화되어 있고 binlog_format이 STATEMENT로 설정되어 있으면, statement는 logging 및 실행되지만 replica가 서로 달라질 수 있으므로 경고 메시지가 error log에 기록됩니다. binlog_format이 MIXED 또는 ROW로 설정된 경우, statement는 정상적으로 실행됩니다.
새 row를 삽입할 때, expression default를 가진 컬럼의 default value는 컬럼 이름을 생략하거나 컬럼을 DEFAULT로 지정하여 삽입할 수 있습니다 (리터럴 default를 가진 컬럼의 경우와 동일하게):
1mysql> CREATE TABLE t4 (uid BINARY(16) DEFAULT (UUID_TO_BIN(UUID()))); 2mysql> INSERT INTO t4 () VALUES(); 3mysql> INSERT INTO t4 () VALUES(DEFAULT); 4mysql> SELECT BIN_TO_UUID(uid) AS uid FROM t4; 5+--------------------------------------+ 6| uid | 7+--------------------------------------+ 8| f1109174-94c9-11e8-971d-3bf1095aa633 | 9| f110cf9a-94c9-11e8-971d-3bf1095aa633 | 10+--------------------------------------+
그러나, 명명된 컬럼의 default value를 지정하기 위해 DEFAULT(col_name)을 사용하는 것은 expression default value를 가진 컬럼이 아니라 리터럴 default value를 가진 컬럼에 대해서만 허용됩니다.
모든 스토리지 엔진이 expression default value를 허용하는 것은 아닙니다. 이를 허용하지 않는 스토리지 엔진의 경우, ER_UNSUPPORTED_ACTION_ON_DEFAULT_VAL_GENERATED 에러가 발생합니다.
Default value가 선언된 컬럼 타입과 다른 data type으로 평가되는 경우, 일반적인 MySQL 타입 변환 규칙에 따라 선언된 타입으로의 암시적 강제 변환이 발생합니다. Section 14.3, “Type Conversion in Expression Evaluation”을 참조하십시오.
Data type 지정에 명시적 DEFAULT value가 포함되어 있지 않은 경우, MySQL은 다음과 같이 default value를 결정합니다:
컬럼이 값으로 NULL을 취할 수 있는 경우, 컬럼은 명시적 DEFAULT NULL 절과 함께 정의됩니다.
컬럼이 값으로 NULL을 취할 수 없는 경우, MySQL은 명시적 DEFAULT 절 없이 컬럼을 정의합니다.
명시적 DEFAULT 절이 없는 NOT NULL 컬럼에 데이터를 입력할 때, INSERT 또는 REPLACE statement에 컬럼 값이 포함되지 않거나, UPDATE statement가 컬럼을 NULL로 설정하는 경우, MySQL은 당시의 SQL mode에 따라 컬럼을 처리합니다:
Strict SQL mode가 활성화된 경우, 트랜잭션 테이블에 대해서는 에러가 발생하고 statement는 롤백됩니다. 비트랜잭션 테이블에 대해서는 에러가 발생하지만, 이는 멀티 row statement의 두 번째 row 이후에서 발생한 경우에만 해당하며, 그 이전 row는 삽입됩니다.
Strict mode가 활성화되어 있지 않은 경우, MySQL은 컬럼을 해당 컬럼 data type에 대한 암시적 default value로 설정합니다.
다음과 같이 테이블 t가 정의되어 있다고 가정합니다:
1CREATE TABLE t (i INT NOT NULL);
이 경우, i에는 명시적 default가 없으므로, strict mode에서는 다음 statement 각각이 에러를 발생시키고 row는 삽입되지 않습니다. Strict mode를 사용하지 않는 경우에는 세 번째 statement만 에러를 발생시킵니다. 첫 두 statement에 대해서는 암시적 default가 삽입되지만, 세 번째 statement는 DEFAULT(i)가 값을 생성할 수 없기 때문에 실패합니다:
1INSERT INTO t VALUES(); 2INSERT INTO t VALUES(DEFAULT); 3INSERT INTO t VALUES(DEFAULT(i));
Section 7.1.11, “Server SQL Modes”를 참조하십시오.
주어진 테이블에 대해, SHOW CREATE TABLE statement는 어떤 컬럼에 명시적 DEFAULT 절이 있는지를 보여줍니다.
Implicit default는 다음과 같이 정의됩니다:
Numeric 타입의 경우, default는 0입니다. 단, AUTO_INCREMENT 속성으로 선언된 integer 또는 floating-point 타입의 경우, default는 시퀀스의 다음 값입니다.
TIMESTAMP를 제외한 date 및 time 타입의 경우, default는 해당 타입에 적합한 “zero” value입니다. 이는 explicit_defaults_for_timestamp 시스템 변수가 활성화된 경우 TIMESTAMP에도 적용됩니다 (Section 7.1.8, “Server System Variables” 참조). 그렇지 않은 경우, 테이블의 첫 번째 TIMESTAMP 컬럼에 대한 default value는 현재 날짜와 시간입니다. Section 13.2, “Date and Time Data Types”를 참조하십시오.
ENUM 이외의 string 타입의 경우, default value는 빈 문자열입니다. ENUM의 경우, default는 첫 번째 enumeration value입니다.
13.5 The JSON Data Type
13.7 Data Type Storage Requirements