MySQL
ENUM
수색…
왜 ENUM인가?
ENUM은 행에 대한 속성을 제공하는 방법을 제공합니다. 적은 수의 비 숫자 옵션이있는 속성이 가장 잘 작동합니다. 예 :
reply ENUM('yes', 'no')
gender ENUM('male', 'female', 'other', 'decline-to-state')
값은 문자열입니다.
INSERT ... VALUES ('yes', 'female')
SELECT ... --> yes female
대안으로 TINYINT
우리가 가지고 있다고 가정 해 봅시다.
type ENUM('fish','mammal','bird')
대안은
type TINYINT UNSIGNED
...을 더한
CREATE TABLE AnimalTypes (
type TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT "('fish','mammal','bird')",
PRIMARY KEY(type),
INDEX(name)
) ENGINE=InnoDB
이것은 many-to-many 테이블과 매우 흡사하다.
비교, 그리고 ENUM보다 좋든 나쁘 든 :
- (더 나쁜) INSERT :
type
찾아야type
- (더 나쁜) SELECT : 문자열을 얻으려면 JOIN해야합니다 (ENUM은 노력없이 문자열을 제공합니다)
- (더 좋음) 새로운 유형 추가 :이 표에 삽입하기 만하면됩니다. ENUM을 사용하면 ALTER TABLE을 수행해야합니다.
- (동일) 어느 기술 (최대 255 값)은 1 바이트 만 사용합니다.
- (혼합) 데이터 무결성의 문제도 있습니다 :
TINYINT
는 유효하지 않은 값을 허용합니다.ENUM
은 특수한 빈 문자열 값으로 설정합니다 (엄격한 SQL 모드가 활성화되어 있지 않은 경우 거부됩니다). 룩업 테이블에 외래 키를 만들어TINYINT
를 통해 데이터 무결성을 향상시킬 수 있습니다. 적절한 쿼리 / 조인을 사용하지만 다른 테이블에 도달하는 데 드는 비용은 여전히 적습니다. (FOREIGN KEYs
는 무료가 아닙니다.)
대안으로 VARCHAR
우리가 가지고 있다고 가정 해 봅시다.
type ENUM('fish','mammal','bird')
대안은
type VARCHAR(20) COMENT "fish, bird, etc"
이것은 새로운 유형이 사소하게 추가된다는 점에서 완전히 개방적입니다.
비교, 그리고 ENUM보다 좋든 나쁘 든 :
- (같은) INSERT : 단순히 문자열을 제공한다.
- (더 나빠?) INSERT시 오타가 눈에 띄지 않게됩니다.
- (동일한) SELECT : 실제 문자열이 반환됩니다.
- (더 나쁜) 더 많은 공간이 소비됩니다.
새 옵션 추가
ALTER TABLE tbl MODIFY COLUMN type ENUM('fish','mammal','bird','insect');
노트
- MODIFY COLUMN의 모든 경우와 마찬가지로
NOT NULL
과 원래 존재했던 다른 한정자를 포함시켜야합니다. 그렇지 않으면 손실됩니다. - 이 목록의 끝에 추가하고 목록 256 개 항목 아래의 경우,
ALTER
단순히 스키마를 변경하여 수행됩니다. 테이블 사본이 길어지지 않습니다. (구 버전의 MySQL에는 이러한 최적화가 없었습니다.)
NULL 대 NOT NULL
NULL 및 'bad-value'가 Null 허용 및 Null 허용 열에 저장 될 때 발생하는 예제 또한 +0
통해 숫자로 형변환의 사용법을 보여줍니다.
CREATE TABLE enum (
e ENUM('yes', 'no') NOT NULL,
enull ENUM('x', 'y', 'z') NULL
);
INSERT INTO enum (e, enull)
VALUES
('yes', 'x'),
('no', 'y'),
(NULL, NULL),
('bad-value', 'bad-value');
Query OK, 4 rows affected, 3 warnings (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 3
mysql>SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1048 | Column 'e' cannot be null |
| Warning | 1265 | Data truncated for column 'e' at row 4 |
| Warning | 1265 | Data truncated for column 'enull' at row 4 |
+---------+------+--------------------------------------------+
3 rows in set (0.00 sec)
삽입 후 테이블에 무엇이 있습니까? 이것은 "+0"을 사용하여 숫자로 변환하여 저장된 내용을 봅니다.
mysql>SELECT e, e+0 FROM enum;
+-----+-----+
| e | e+0 |
+-----+-----+
| yes | 1 |
| no | 2 |
| | 0 | -- NULL
| | 0 | -- 'bad-value'
+-----+-----+
4 rows in set (0.00 sec)
mysql>SELECT enull, enull+0 FROM enum;
+-------+---------+
| enull | enull+0 |
+-------+---------+
| x | 1 |
| y | 2 |
| NULL | NULL |
| | 0 | -- 'bad-value'
+-------+---------+
4 rows in set (0.00 sec)
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow