web-dev-qa-db-fra.com

Comment créer un type ENUM dans SQLite?

Je dois convertir une table de MySQL en SQLite, mais je ne vois pas comment convertir un champ enum, car je ne trouve pas le type ENUM en 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 à choisir par l'utilisateur, et j'aimerais l'imposer dans la base de données, pas seulement dans mon application.

91
onedevteam.com

Il n'y a pas de type enum dans SQLite, seulement les suivants:

  • NUL
  • ENTIER
  • RÉAL
  • TEXTE
  • GOUTTE

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

Je crains qu'un petit tableau personnalisé ne soit requis dans votre cas.

74
MPelletier

La méthode SQLite consiste à utiliser un contrainte CHECK .

Quelques exemples:

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

Ceci limitera la colonne pType aux seules valeurs M, R et H, tout comme enum("M", "R", "H") le ferait dans certains cas. autres moteurs SQL.

77
mateusza

Pour développer la réponse de MPelletier, vous pouvez créer les tableaux comme suit:

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

Désormais, les valeurs d’énumération sont disponibles directement dans la table Price, comme si elles utilisaient 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 valeurs. les ENUM.

Les contraintes de clé étrangère ont été introduites dans SQLite version 3.6.19.

50
ChrisV