Necesito convertir una tabla de MySQL a SQLite, pero no puedo averiguar cómo convertir un campo de enumeración, porque no puedo encontrar el ENUM
tipo en SQLite.
El campo mencionado anteriormente se encuentra 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 solo tres valores para que el usuario elija, y me gustaría hacer cumplir eso en la base de datos, no solo en mi aplicación.
CHECK()
existiera en el momento en que escribí esa respuesta. A menos que la cuerda sea muy corta, estoy totalmente en contra. Máximo 1 o 2 caracteres.VARCHAR
en mi versión de SQLite, ¿es una adición de nuevo tipo?TEXT
. En la página de origen que proporcioné, consulte el punto 2.1 sobre Determinación de la afinidad de columnas.La forma de SQLite es usar una restricción CHECK .
Algunos ejemplos:
Esto limitará la
pType
columna a solo los valoresM
,R
yH
, tal comoenum("M", "R", "H")
lo haría en otros motores SQL.fuente
enum
porque hace que sea imposible ordenar por el índice entero de los valores (lo cual es posible con unenum
campo real ). Solo, todos, tengan eso en cuenta.Para expandir la respuesta de MPelletier, puede crear las tablas así:
Ahora los valores de enumeración están disponibles directamente en la tabla de precios, ya que estarían usando un ENUM: no necesita unirse a la tabla de tipos de precios para obtener los valores de tipo, solo necesita usarlos si desea determinar la secuencia de los ENUM.
Las restricciones de clave externa se introdujeron en SQLite versión 3.6.19.
fuente
INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3);
Debería darte un error de sintaxis. "El primer formulario (con la palabra clave" VALUES ") crea una única fila nueva en una tabla existente". : 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;
para cada sesión, porque las teclas f están deshabilitadas de forma predeterminada en sqlite3PRAGMA foreign_keys = ON;
, puede configurarlo en su archivo .sqliterc en su directorio de inicio.UNIQUE
restricción en Seq. Algo como estoCREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);