2011-03-14 281 views
73

我需要将表格从MySQL转换为SQLite,但我无法弄清楚如何转换枚举字段,因为我在SQLite中找不到ENUM类型。如何在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 

我需要的只有三个值的字段以供用户选择,我想强制执行,在DB,不只是在我应用。

回答

52

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

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB

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

恐怕在你的情况下需要一个小的自定义枚举表。

+21

其实“自定义枚举表”是用真实的枚举 – 2011-03-14 15:55:05

+11

为什么不使用CHECK()约束,只允许三个可能的字符串更清洁的设计? – mateusza 2013-06-19 23:31:04

+2

>只允许三个可能的字符串:由于存储字符串? – 2014-05-09 20:18:57

48

对于其他人来到这个在未来,对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); 

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

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

+3

'INSERT INTO PriceType(Type,Seq)VALUES('M',1),('R',2),('H',3);'应该给你一个语法错误。 _“第一种形式(带有”VALUES“关键字)在现有表中创建一个新行。”_:https://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-06-05 20:55:34

+0

有一个答案意味着是一个评论,但现在已经消失了。实质上,自SQLite 3.7.11以来,可以使用INSERT来创建多个条目。更正的语法仍然有效。 – MPelletier 2012-11-27 17:31:41

+6

不要忘记'PRAGMA foreign_keys = ON;'为每个会话 - 因为fkeys默认在sqlite3中被禁用 – smathy 2013-04-03 04:38:19

51

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