如何在 SQLite 中创建 ENUM 类型?

我需要将一个表从 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

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

110629 次浏览

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

  • 无效
  • 整数
  • 真的
  • 短信
  • 一团

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

对于您的情况,恐怕需要一个小的自定义枚举表。

要扩展 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中引入了外键约束。

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

这将把 pType列限制为仅包含值 MRH 就像 enum("M", "R", "H")在其他 SQL 引擎中所做的那样。