我需要将一个表从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
我需要一个只有三个值的字段供用户选择,我想在数据库中强制执行,而不仅仅是在我的应用程序中。
答案 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
列限制为仅M
,R
和H
,只需
像enum("M", "R", "H")
一样可以在其他一些SQL引擎中使用。
答案 1 :(得分:70)
SQLite中没有枚举类型,只有以下内容:
来源: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中引入了外键约束。