Muszę przekonwertować tabelę z MySQL na SQLite, ale nie mogę dowiedzieć się, jak przekonwertować pole wyliczenia, ponieważ nie mogę znaleźć ENUM
typu w SQLite.
Wspomniane pole znajduje się pType
w poniższej tabeli:
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
Potrzebuję pola zawierającego tylko trzy wartości do wyboru przez użytkownika i chciałbym wymusić to w bazie danych, a nie tylko w mojej aplikacji.
CHECK()
istniał w momencie, gdy pisałem tę odpowiedź. Jeśli struna nie jest naprawdę krótka, jestem temu całkowicie przeciwny. Maksymalnie 1 lub 2 znaki.VARCHAR
w mojej wersji SQLite, czy to jest nowy dodatek typu?TEXT
. Na stronie źródłowej, którą podałem, patrz punkt 2.1 na temat określania powinowactwa kolumn.Sposób SQLite polega na użyciu ograniczenia CHECK .
Kilka przykładów:
Pozwoli to ograniczyć
pType
kolumnę tylko wartościM
,R
orazH
, podobnie jakenum("M", "R", "H")
byłoby zrobić w niektórych innych silników SQL.źródło
enum
ponieważ uniemożliwia sortowanie według indeksów całkowitych wartości (co jest możliwe w przypadku rzeczywistegoenum
pola). Po prostu wszyscy, miejcie to na uwadze.Aby rozwinąć odpowiedź MPelletier, możesz utworzyć takie tabele:
Teraz wartości wyliczenia są dostępne bezpośrednio w tabeli Price, tak jak przy użyciu ENUM: nie musisz łączyć się z tabelą PriceType, aby uzyskać wartości Type, musisz ich użyć tylko wtedy, gdy chcesz określić sekwencję ENUMs.
Ograniczenia klucza obcego zostały wprowadzone w SQLite w wersji 3.6.19.
źródło
INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3);
Powinien spowodować błąd składni. „Pierwszy formularz (ze słowem kluczowym„ VALUES ”) tworzy jeden nowy wiersz w istniejącej tabeli.” : sqlite.org/lang_insert.html . Zerwij, unikaj tego:INSERT INTO PriceType(Type, Seq) VALUES ('M',1); INSERT INTO PriceType(Type, Seq) VALUES ('R',2); INSERT INTO PriceType(Type, Seq) VALUES ('H',3);
PRAGMA foreign_keys = ON;
o każdej sesji - ponieważ fkeys są domyślnie wyłączone w sqlite3PRAGMA foreign_keys = ON;
możesz to ustawić w swoim pliku .sqliterc w swoim katalogu domowym.UNIQUE
ograniczenia dla Seq. Coś takiegoCREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);