Мне нужно преобразовать таблицу из MySQL в SQLite, но я не могу понять, как преобразовать поле перечисления, потому что я не могу найти 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
Мне нужно поле только с тремя значениями для выбора пользователем, и я хотел бы применить это в БД, а не только в моем приложении.
CHECK()
существовал в то время, когда я писал этот ответ. Если строка не является действительно коротким, я категорически против этого. Максимум 1 или 2 символа.VARCHAR
в своей версии SQLite, это добавление нового типа?TEXT
. На исходной странице, которую я предоставил, см. Пункт 2.1 об определении родства столбцов.Способ SQLite - использовать ограничение CHECK .
Некоторые примеры:
Это ограничит
pType
столбец только значениямиM
,R
иH
, какenum("M", "R", "H")
и в некоторых других механизмах SQL.источник
enum
потому что делает невозможным сортировку по целочисленному индексу значений (что возможно с фактическимenum
полем). Просто имейте это в виду.Чтобы расширить ответ MPelletier, вы можете создать такие таблицы:
Теперь значения перечисления доступны непосредственно в таблице цен, как если бы они использовали ENUM: вам не нужно присоединяться к таблице PriceType, чтобы получить значения Type, вам нужно использовать ее только в том случае, если вы хотите определить последовательность ENUM.
Ограничения внешнего ключа были введены в SQLite версии 3.6.19.
источник
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);
PRAGMA foreign_keys = ON;
для каждой сессии - потому что fkeys по умолчанию отключены вPRAGMA foreign_keys = ON;
вы можете настроить это в своем файле .sqliterc в своем домашнем каталоге.UNIQUE
ограничение на Seq. Примерно такCREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);