2011-03-14 107 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' 
)