SQLite에서 ENUM 유형을 만드는 방법은 무엇입니까?


105

MySQL에서 SQLite로 테이블을 변환해야하지만 SQLite에서 ENUM유형을 찾을 수 없기 때문에 enum 필드를 변환하는 방법을 알 수 없습니다 .

앞서 언급 한 필드는 pType다음 표에 있습니다.

CREATE TABLE `prices` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `pName` VARCHAR(100) NOT NULL DEFAULT '',
    `pType` ENUM('M','R','H') NOT NULL DEFAULT 'M',
    `pField` VARCHAR(50) NULL DEFAULT NULL,
    `pFieldExt` VARCHAR(50) NULL DEFAULT NULL,
    `cmp_id` INT(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT

사용자가 선택할 수있는 값이 세 개 뿐인 필드가 필요하며 응용 프로그램뿐 아니라 DB에서도이를 적용하고 싶습니다.

답변:


81

SQLite에는 열거 형이 없으며 다음 만 해당됩니다.

  • 없는
  • 정수
  • 레알
  • 본문
  • 얼룩

출처 : http://www.sqlite.org/datatype3.html

귀하의 경우에는 작은 사용자 정의 열거 테이블이 필요합니다.


26
실제로 "사용자 정의 열거 형 테이블"은 실제 열거 형을 사용하는 것보다 훨씬 더 깔끔한 디자인입니다
a_horse_with_no_name 2011 년

19
3 개의 가능한 문자열 만 허용하기 위해 CHECK () 제약 조건을 사용하지 않는 이유는 무엇입니까?
mateusza

1
@Wideshanks 나는 CHECK()그 대답을 썼을 때 존재 하지 않았다고 생각 합니다. 줄이 정말 짧지 않으면 전적으로 반대합니다. 최대 1 자 또는 2 자.
MPelletier

VARCHARSQLite 버전에서 사용할 수 있습니다 . 새로운 유형 추가입니까?
Hamman Samuel

3
@HammanSamuel 그것은 새로운 것이 아니라 의미로 해결되었습니다 TEXT. 내가 준 소스 페이지에서 컬럼 선호도 결정에 대한 2.1 번 항목을 참조하십시오.
MPelletier 2015-06-21

106

SQLite 방식은 CHECK 제약 조건 을 사용하는 것 입니다.

몇 가지 예 :

CREATE TABLE prices (
 id         INTEGER                                PRIMARY KEY,
 pName      TEXT CHECK( LENGTH(pName) <= 100 )     NOT NULL DEFAULT '',
 pType      TEXT CHECK( pType IN ('M','R','H') )   NOT NULL DEFAULT 'M',
 pField     TEXT CHECK( LENGTH(pField) <= 50 )     NULL DEFAULT NULL,
 pFieldExt  TEXT CHECK( LENGTH(pFieldExt) <= 50 )  NULL DEFAULT NULL,
 cmp_id     INTEGER                                NOT NULL DEFAULT '0'
)

이것은 제한 할 것이다 pType단지 값으로 열을 M, R그리고 H처럼 enum("M", "R", "H")다른 SQL 엔진에서 할 것입니다.


2
Welp, 실제로이 구현은 enum값의 정수 인덱스 (실제 enum필드에서 가능함)로 정렬 할 수 없기 때문에 완전히 에뮬레이트되지 않습니다 . 여러분, 명심하십시오.
Boris D. Teoharov

53

MPelletier의 답변을 확장하려면 다음과 같이 테이블을 만들 수 있습니다.

CREATE TABLE Price (
  PriceId INTEGER       PRIMARY KEY AUTOINCREMENT NOT NULL,
  Name    VARCHAR(100)  NOT NULL,
  Type    CHAR(1)       NOT NULL DEFAULT ('M') REFERENCES PriceType(Type)
);

CREATE TABLE PriceType (
  Type    CHAR(1)       PRIMARY KEY NOT NULL,
  Seq     INTEGER
);
INSERT INTO PriceType(Type, Seq) VALUES ('M',1);
INSERT INTO PriceType(Type, Seq) VALUES ('R',2);
INSERT INTO PriceType(Type, Seq) VALUES ('H',3);

이제 열거 형 값은 ENUM을 사용하는 것처럼 Price 테이블에서 직접 사용할 수 있습니다. 유형 값을 가져 오기 위해 PriceType 테이블에 조인 할 필요가 없습니다. ENUMs.

SQLite 버전 3.6.19에서 외래 키 제약 조건이 도입되었습니다.


3
INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3);구문 오류가 발생합니다. "첫 번째 양식 ("VALUES "키워드 포함)은 기존 테이블에 하나의 새 행을 만듭니다." : sqlite.org/lang_insert.html . 그것을 피하십시오 :INSERT INTO PriceType(Type, Seq) VALUES ('M',1); INSERT INTO PriceType(Type, Seq) VALUES ('R',2); INSERT INTO PriceType(Type, Seq) VALUES ('H',3);
ahcox

9
PRAGMA foreign_keys = ON;모든 세션 에 대해 잊지 마세요
-sqlite3

3
잊지 않으 PRAGMA foreign_keys = ON;려면 홈 디렉토리의 .sqliterc 파일에서 설정할 수 있습니다.
Eradicatore

1
또한 UNIQUESeq에 대한 제약 조건 을 사용할 수 있습니다 . 이런 것CREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);
Eradicatore

1
기본 rowid 열을 사용하는 대신 별도의 'Seq'열을 만드는 이유는 무엇 입니까?
Parthian Shot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.