如何在SQLite中创建枚举类型?
我需要将一个表从MySQL转换为SQLite,但我不知道如何转换枚举字段,因为我在SQLite中找不到如何在SQLite中创建枚举类型?,sqlite,types,enums,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`
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
我需要一个只有三个值的字段供用户选择,我希望在数据库中强制执行,而不仅仅是在我的应用程序中。SQLite中没有枚举类型,只有以下类型:
- 空的
- 整数
- 真实的
- 正文
- 斑点
恐怕您需要一个小型的自定义枚举表。要扩展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表中使用,因为它们将使用枚举:您不需要连接到PriceType表来获取类型值,只需要在确定枚举序列时使用它
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'
)
创建价格表(
id整数主键,
pName TEXT CHECK(LENGTH(pName))实际上“一个自定义枚举表”是一个更简洁的设计,使用实枚举为什么不使用CHECK()约束只允许三个可能的字符串?@widehanks我不认为CHECK()
在我写这个答案的时候就已经存在了。除非字符串真的很短,否则我完全反对它。最多1到2个字符。我可以在我的SQLite版本中使用VARCHAR
,这是一个新的类型添加吗?@HammanSamuel它不是新的,它被解析为含义文本
。在我给出的源页面上,请参阅关于C的确定的第2.1点列关联。插入到PriceType(Type,Seq)值('M',1),('R',2),('H',3);
应该会得到一个语法错误。“第一个表单(带有“VALUES”关键字)在现有表中创建一个新行。”:。分解它避免:插入到PriceType(Type,Seq)值('M',1);插入到PriceType(Type,Seq)值('R',2);插入PriceType(Type,Seq)值('H',3)
不要忘记为每个会话设置PRAGMA-foreign\u-keys=ON;
因为在SQLite3中默认情况下禁用Fkey,如果您想避免忘记PRAGMA-foreign\u-keys=ON;
则可以在主目录中的.sqliterc文件中设置它。此外,您可能需要在Seq.Somet上使用UNIQUE
约束像这样创建表PriceType(Type Char(1)PRIMARY KEY NOT NULL,Seq INTEGER UNIQUE);
为什么要创建一个单独的'Seq'列而不是使用默认值?Welp,实际上这个实现没有完全模拟enum
,因为它使得无法按值的整数索引排序(这在实际的enum
字段中是可能的)。只是,各位,请记住这一点。