2011-03-14 22 views
73

Necesito convertir una tabla de MySQL a SQLite, pero no puedo entender cómo convertir un campo enum, porque no puedo encontrar el tipo ENUM en SQLite.¿Cómo crear el tipo ENUM en SQLite?

El campo antes mencionado es pType en la siguiente tabla:

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 

Necesito un campo con sólo tres valores para el usuario para elegir, y me gustaría hacer valer que en el PP, no sólo en mi solicitud.

Respuesta

52

No hay ningún tipo de enumeración en SQLite, sólo el siguiente:

  • NULL
  • INTEGER
  • VERDADERO
  • TEXTO
  • BLOB

Fuente: http://www.sqlite.org/datatype3.html

Me temo que se necesitará una pequeña tabla de enumeración personalizada en su caso.

+21

realidad "una tabla de enumeración personalizada" es un diseño mucho más limpio que el uso de enumeraciones reales –

+11

Por qué no usar restricción CHECK() para permitir sólo tres cuerdas posibles? – mateusza

+2

> permite solo tres cadenas posibles: ¿por el almacenamiento de la cadena? –

48

Para otros próximos a esto en el futuro, para ampliar la respuesta de MPelletier, puede crear las tablas como:

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); 

hace así, los valores de la enumeración están disponibles directamente en la tabla de precios como lo harían estar usando un ENUM: no necesita unirse a la tabla PriceType para obtener los valores de Type, solo necesita usarlo si desea determinar la secuencia de los ENUM.

Las restricciones de clave externa se introdujeron en SQLite versión 3.6.19.

+3

'INSERTAR EN PriceType (Type, Seq) VALUES ('M', 1), ('R', 2), ('H', 3);' Debería obtener un error de sintaxis. _ "La primera forma (con la palabra clave" VALUES ") crea una única fila nueva en una tabla existente." _: Https://sqlite.org/lang_insert.html. Divídalo y evite eso: 'INSERTAR EN PriceType (Type, Seq) VALUES ('M', 1); INSERTAR EN PriceType (Type, Seq) VALUES ('R', 2); INSERTAR EN PriceType (Type, Seq) VALUES ('H', 3); ' – ahcox

+0

Hubo una respuesta que debía ser un comentario, pero ahora se ha ido. Esencialmente, desde SQLite 3.7.11, se pueden realizar varias entradas con INSERT. La sintaxis corregida todavía funciona también. – MPelletier

+6

No olvide 'PRAGMA foreign_keys = ON;' para cada sesión - porque los botones fkeys están deshabilitados por defecto en sqlite3 – smathy

51

manera SQLite

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' 
)