Ich muss eine Tabelle von MySQL nach SQLite konvertieren, kann aber nicht herausfinden, wie ein Aufzählungsfeld konvertiert wird, da ich ENUM
in SQLite keinen Typ finden kann .
Das oben genannte Feld befindet sich pType
in der folgenden Tabelle:
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
Ich benötige ein Feld mit nur drei Werten, die der Benutzer auswählen kann, und ich möchte dies in der Datenbank erzwingen, nicht nur in meiner Anwendung.
CHECK()
es zu dem Zeitpunkt, als ich diese Antwort schrieb, existiert hat. Wenn die Saite nicht wirklich kurz ist, bin ich total dagegen. Maximal 1 oder 2 Zeichen.VARCHAR
in meiner SQLite-Version verwenden. Ist das ein neuer Typzusatz?TEXT
. Auf der von mir angegebenen Quellseite siehe Punkt 2.1 zur Bestimmung der Spaltenaffinität.SQLite-Methode ist die Verwendung einer CHECK-Einschränkung .
Einige Beispiele:
Dadurch wird die
pType
Spalte nur auf die Werte beschränktM
,R
undH
genau wieenum("M", "R", "H")
bei einigen anderen SQL-Engines.quelle
enum
da es unmöglich ist, nach dem ganzzahligen Index der Werte zu sortieren (was mit einem tatsächlichenenum
Feld möglich ist). Denken Sie daran.Um die Antwort von MPelletier zu erweitern, können Sie die Tabellen folgendermaßen erstellen:
Jetzt sind die Aufzählungswerte direkt in der Preistabelle verfügbar, da sie eine ENUM verwenden würden: Sie müssen sich nicht mit der PriceType-Tabelle verbinden, um die Typwerte zu erhalten. Sie müssen sie nur verwenden, wenn Sie die Reihenfolge von bestimmen möchten die ENUMs.
In SQLite Version 3.6.19 wurden Fremdschlüsseleinschränkungen eingeführt.
quelle
INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3);
Sollte Ihnen einen Syntaxfehler bringen. "Das erste Formular (mit dem Schlüsselwort" VALUES ") erstellt eine einzelne neue Zeile in einer vorhandenen Tabelle." : sqlite.org/lang_insert.html . Brechen Sie es auf, vermeiden SieINSERT 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;
für jede Sitzung - da fkeys in sqlite3 standardmäßig deaktiviert sindPRAGMA foreign_keys = ON;
können Sie dies in Ihrer .sqliterc-Datei in Ihrem Home-Verzeichnis einrichten.UNIQUE
Einschränkung für Seq. So etwas wieCREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);