Preciso converter uma tabela do MySQL para SQLite, mas não consigo descobrir como converter um campo enum, porque não consigo encontrar o ENUM
tipo no SQLite.
O referido campo encontra-se pType
na seguinte tabela:
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
Preciso de um campo com apenas três valores para o usuário escolher, e gostaria de impor isso no banco de dados, não apenas em meu aplicativo.
CHECK()
existia na época em que escrevi essa resposta. A menos que a corda seja muito curta, sou totalmente contra. 1 ou 2 caracteres no máximo.VARCHAR
na minha versão SQLite, é um novo tipo de adição?TEXT
. Na página de origem que apresentei, consulte o ponto 2.1 em Determinação da afinidade da coluna.A maneira SQLite é usar uma restrição CHECK .
Alguns exemplos:
Isso irá limitar a
pType
coluna para apenas os valoresM
,R
eH
, assim comoenum("M", "R", "H")
faria em alguns outros motores de SQL.fonte
enum
porque torna impossível classificar pelo índice inteiro dos valores (o que é possível com umenum
campo real ). Apenas, todos, tenham isso em mente.Para expandir a resposta do MPelletier, você pode criar as tabelas assim:
Agora, os valores de enumeração estão disponíveis diretamente na tabela Price, pois estariam usando um ENUM: você não precisa se juntar à tabela PriceType para obter os valores Type, você só precisa usá-lo se quiser determinar a sequência de os ENUMs.
As restrições de chave estrangeira foram introduzidas no SQLite versão 3.6.19.
fonte
INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3);
Você deve obter um erro de sintaxe. "A primeira forma (com a palavra-chave" VALUES ") cria uma única linha nova em uma tabela existente." : sqlite.org/lang_insert.html . Divida para evitar que: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;
para cada sessão - porque fkeys são desabilitadas por padrão no sqlite3PRAGMA foreign_keys = ON;
, pode configurar isso em seu arquivo .sqliterc em seu diretório inicial.UNIQUE
restrição em Seq. Algo assimCREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);