如何在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`

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

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

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
字段中是可能的)。只是,各位,请记住这一点。