如何在SQLite中创建ENUM类型?

时间:2011-03-14 13:34:51

标签: sqlite types enums

我需要将一个表从MySQL转换为SQLite,但我无法弄清楚如何转换枚举字段,因为我在SQLite中找不到ENUM类型。

上表中的字段为pType,如下表所示:

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

我需要一个只有三个值的字段供用户选择,我想在数据库中强制执行,而不仅仅是在我的应用程序中。

3 个答案:

答案 0 :(得分:75)

SQLite方式是使用CHECK constraint

一些例子:

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

这会将pType列限制为仅MRH,只需 像enum("M", "R", "H")一样可以在其他一些SQL引擎中使用。

答案 1 :(得分:70)

SQLite中没有枚举类型,只有以下内容:

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB

来源:http://www.sqlite.org/datatype3.html

我担心你的情况下需要一个小的自定义枚举表。

答案 2 :(得分:50)

要扩展MPelletier的答案,您可以像这样创建表格:

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

现在枚举值可直接在Price表中使用,因为它们将使用ENUM:您不需要连接到PriceType表来获取Type值,如果要确定,则只需要使用它ENUM的序列。

SQLite版本3.6.19中引入了外键约束。