Как создать тип ENUM в SQLite? - PullRequest
91 голосов
/ 14 марта 2011

Мне нужно преобразовать таблицу из MySQL в SQLite, но я не могу понять, как преобразовать поле enum, потому что я не могу найти тип ENUM в SQLite.

Вышеупомянутое полев следующей таблице: 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

Мне нужно поле, содержащее только три значения, которые может выбрать пользователь, и я хотел бы применить это в БД, а не только в моем приложении.

Ответы [ 3 ]

75 голосов
/ 20 июня 2013

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.

71 голосов
/ 14 марта 2011

В SQLite нет типа enum, только следующее:

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB

Источник: http://www.sqlite.org/datatype3.html

Боюсь, в вашем случае потребуется небольшая таблица с перечислением.

50 голосов
/ 30 мая 2012

Чтобы расширить ответ 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: вам не нужночтобы присоединиться к таблице PriceType для получения значений типа, ее нужно использовать только в том случае, если вы хотите определить последовательность ENUM.

В SQLite версии 3.6.19 были введены ограничения внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...