如何在SQLite中创建ENUM类型?


105

我需要将表从MySQL转换为SQLite,但是我不知道如何转换枚举字段,因为我无法ENUM在SQLite中找到类型。

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

我需要一个只有三个值的字段供用户选择,我想在数据库中(而不只是在我的应用程序中)实施该字段。

Answers:


81

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

  • 空值
  • 整数
  • 真实
  • 文本
  • BLOB

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

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


26
实际上,“自定义枚举表”是一种使用真实枚举的更
简洁的

19
为什么不使用CHECK()约束只允许三个可能的字符串?
mateusza 2013年

1
@Wideshanks我CHECK()写那个答案的时候还不存在。除非字符串真的很短,否则我完全反对。最多1个或2个字符。
MPelletier,2014年

我可以VARCHAR在SQLite版本中使用,这是新增类型吗?
哈曼·塞缪尔

3
@HammanSamuel这不是新词,它已按含义解决TEXT。在我提供的源代码页面上,请参见关于确定列亲和力的第2.1点。
MPelletier

106

SQLite的方法是使用CHECK约束

一些例子:

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

就像在其他SQL引擎中一样,这会将pType列限制为仅值MR和。Henum("M", "R", "H")


2
Welp,实际上,此实现未完全仿真,enum因为它无法按值的整数索引排序(在实际enum字段中可能)。大家,请记住这一点。
Boris D. Teoharov

53

要扩展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值,只需要在确定序列顺序时使用它即可。枚举。

外键约束是在SQLite 3.6.19版中引入的。


3
INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3);应该让您语法错误。“第一种形式(带有“ VALUES”关键字)在现有表中创建一个新行。” 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);
ahcox 2012年

9
不要忘记PRAGMA foreign_keys = ON;每次会话-因为默认情况下sqlite3中禁用了
fkeys

3
如果要避免忘记PRAGMA foreign_keys = ON;,可以在主目录的.sqliterc文件中进行设置。
Eradicatore

1
另外,您可能要UNIQUE对Seq 使用约束。像这样CREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);
Eradicatore

1
为什么要创建一个单独的“ Seq”列而不是仅使用默认的rowid列
Parthian Shot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.