2011-03-14 22 views
73

Bir tabloyu MySQL'den SQLite'ye dönüştürmem gerekiyor, ancak bir enum alanını nasıl dönüştüreceğimi anlayamıyorum, çünkü SQLite'de ENUM türünü bulamıyorum.SQLite'de ENUM türü nasıl oluşturulur?

yukarıda belirtilen alan aşağıdaki tabloda pType geçerli:

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 

seçilmek için kullanıcı için sadece üç değerlerle bir alan gerekir ve ben sadece içinde, DB zorunlu kılmak istiyoruz benim uygulama.

  • BOŞ
  • TAMSAYILI
  • GERÇEK
  • METİN
  • BLOB

Kaynak:

cevap

52

SQLite'ta hiçbir enum türü, yalnızca aşağıdaki vardır http://www.sqlite.org/datatype3.html

Korkarım ki durumunuza küçük, özel bir enum tablosu gerekecek. MPelletier cevabı genişletmek için, gelecekte bu gelen Diğerleri için

+21

"Özel enum tablosu" Neden sadece üç olası dizeleri izin Slayt() kısıtlamasını kullanmayın gerçek çeteleler –

+11

kullanarak daha temiz bir tasarımdır? – mateusza

+2

> yalnızca üç olası dizeye izin ver: Dizge için depolama nedeniyle? –

48

, siz tabloları oluşturabilirsiniz: Böyle Yapıldı

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

, numaralandırma değerleri, olduğu gibi Fiyat tabloda doğrudan mevcuttur ENUM kullanarak: Type değerlerini almak için PriceType tablosuna katılmanız gerekmez, sadece ENUM'ların sırasını belirlemek istiyorsanız onu kullanmanız gerekir. SQLite 3.6.19 sürümünde yabancı anahtar kısıtlamaları getirildi.

+3

'INSERT INTO Fiyat Tipi (Tip, Sıra) DEĞERLER ('M', 1), ('R', 2), ('H', 3);' Size bir sözdizimi hatası vermeliyiz. _ "İlk form (" VALUES "anahtar sözcüğüyle) mevcut bir tabloda yeni bir satır oluşturur." _: Https://sqlite.org/lang_insert.html. Onu kırmaktan kaçının: 'INSERT INTO INTEGA (Tip, Sıra) DEĞERLER ('M', 1); INSERT INTO Fiyat Tipi (Tip, Sıra) DEĞERLER ('R', 2); Fiyat Tipi (Tip, Sıra) DEĞERLER ('H', 3); ' – ahcox

+0

Bir yorum olması gereken bir cevap vardı, ama şimdi gitti. Aslında, SQLite 3.7.11'den beri INSERT ile çeşitli girişler yapılabilir. Düzeltilen sözdizimi hala çalışıyor. – MPelletier

+6

PRAGMA foreign_keys = ON; 'her oturum için unutmayın, çünkü fkeyler sqlite3 içinde varsayılan olarak devre dışı bırakılır – smathy

51

SQLite yolu Aslında

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' 
) 
İlgili konular