J'ai besoin de convertir une table de MySQL en SQLite, mais je ne peux pas comprendre comment convertir un champ d'énumération, car je ne trouve pas de ENUM
type dans SQLite.
Le champ susmentionné est pType
dans le tableau suivant:
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
J'ai besoin d'un champ avec seulement trois valeurs que l'utilisateur doit choisir, et je voudrais appliquer cela dans la base de données, pas seulement dans mon application.
CHECK()
existait au moment où j'ai écrit cette réponse. À moins que la corde ne soit vraiment courte, je suis totalement contre. 1 ou 2 caractères maximum.VARCHAR
dans ma version SQLite, est-ce un nouveau type d'ajout?TEXT
. Sur la page source que j'ai donnée, voir le point 2.1 sur la détermination de l'affinité de colonne.La méthode SQLite consiste à utiliser une contrainte CHECK .
Quelques exemples:
Cela limitera la
pType
colonne aux seules valeursM
,R
etH
, comme leenum("M", "R", "H")
ferait certains autres moteurs SQL.la source
enum
car elle rend impossible le tri par index entier des valeurs (ce qui est possible avec unenum
champ réel ). Juste, tout le monde, gardez cela à l'esprit.Pour développer la réponse de MPelletier, vous pouvez créer les tableaux comme ceci:
Désormais, les valeurs d'énumération sont disponibles directement dans la table Price car elles utiliseraient un ENUM: vous n'avez pas besoin de vous joindre à la table PriceType pour obtenir les valeurs Type, vous devez uniquement l'utiliser si vous souhaitez déterminer la séquence de les ENUM.
Les contraintes de clé étrangère ont été introduites dans la version 3.6.19 de SQLite.
la source
INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3);
Devrait vous obtenir une erreur de syntaxe. "Le premier formulaire (avec le mot clé" VALUES ") crée une seule nouvelle ligne dans une table existante." : sqlite.org/lang_insert.html . Brisez-le, évitez cela: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;
pour chaque session - car les touches fkeys sont désactivées par défaut dans sqlite3PRAGMA foreign_keys = ON;
vous pouvez le configurer dans votre fichier .sqliterc dans votre répertoire personnel.UNIQUE
contrainte sur Seq. Quelque chose comme çaCREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);