Korrekte database.sql erzeugen: Unterschied zwischen den Versionen
Aus Contao Community Documentation
K (→Beispiel Statement und Hinweise dazu) |
Lucina (Diskussion | Beiträge) (Datei kann sich auch woanders befinden. 7824 Magicsepp (Diskussion) rückgängig gemacht.) |
||
(21 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
[[Category:Dev Snippets]] | [[Category:Dev Snippets]] | ||
{{AppliesTo|TLVersion=ab 2.6|Version=ab 2.9}} | {{AppliesTo|TLVersion=ab 2.6|Version=ab 2.9}} | ||
+ | |||
=Normalfall= | =Normalfall= | ||
Damit die Tabellen nicht mehr in dieser Sektion erscheinen, macht man einfach folgendes nachdem die Tabelle einmal korrekt angelegt worden ist:<br /> | Damit die Tabellen nicht mehr in dieser Sektion erscheinen, macht man einfach folgendes nachdem die Tabelle einmal korrekt angelegt worden ist:<br /> | ||
− | # SQL Mode überprüfen. (Wird bei den meisten nicht relevant sein) Contao arbeitet unter MySQL nicht im Strictmodus, welcher standardmäßig auch aus ist. Einfach im phpMyAdmin oder auf der Konsole eingeben und kontrollieren, dass der Wert leer ist:< | + | # SQL Mode überprüfen. (Wird bei den meisten nicht relevant sein) Contao arbeitet unter MySQL nicht im Strictmodus, welcher standardmäßig auch aus ist. Einfach im phpMyAdmin oder auf der Konsole eingeben und kontrollieren, dass der Wert leer ist:<source lang="sql">SHOW VARIABLES LIKE 'sql_mode';</source>Wenn nicht leer gibt man folgendes ein:<source lang="sql">SET sql_mode = '';</source> |
− | # Nun lässt man sich das create statement zurückgeben:< | + | # Nun lässt man sich das create statement zurückgeben:<source lang="sql">SHOW CREATE TABLE tl_MODULE_TABLE_NAME;</source>tl_MODULE_TABLE_NAME natürlich durch den eigenen Tabellen Namen ersetzen. Dieses Statement ist nun genau so in der database.sql zu verwenden. |
+ | |||
{{Achtung|Es gibt Ausnahmen, siehe nächsten Abschnitt.}} | {{Achtung|Es gibt Ausnahmen, siehe nächsten Abschnitt.}} | ||
− | + | ||
=Spezialfall= | =Spezialfall= | ||
Leider funktioniert das nicht ganz bei Feldern die NULL sein dürfen, Beispiel: | Leider funktioniert das nicht ganz bei Feldern die NULL sein dürfen, Beispiel: | ||
− | < | + | <source lang="mysql"> |
− | `price2` double(255,0) NULL</ | + | `price` decimal(20,4) NULL , |
+ | `price2` double(255,0) NULL | ||
+ | </source> | ||
+ | |||
MySQL gibt nach obigem Beispiel zurück: | MySQL gibt nach obigem Beispiel zurück: | ||
− | < | + | |
− | `price2` double(255,0) default NULL</ | + | <source lang="mysql">`price` decimal(20,4) default NULL, |
+ | `price2` double(255,0) default NULL | ||
+ | </source> | ||
+ | |||
Beides akzeptiert Contao aber nicht. Dafür die vollständige Variante: | Beides akzeptiert Contao aber nicht. Dafür die vollständige Variante: | ||
− | < | + | |
− | `price2` double(255,0) NULL default NULL</ | + | <source lang="mysql"> |
− | Hier ist also etwas Nacharbeit nötig. <br /> | + | `price` decimal(20,4) NULL default NULL, |
+ | `price2` double(255,0) NULL default NULL | ||
+ | </source> | ||
+ | |||
+ | Hier ist also etwas Nacharbeit nötig.<br /> | ||
Andererseits auch einfach zu merken, immer den vollständigen Syntax nehmen: | Andererseits auch einfach zu merken, immer den vollständigen Syntax nehmen: | ||
− | < | + | <source lang="mysql"> |
− | + | NAME TYP[(WIDTH, PRECISION, SCALE)] [NOT] NULL default VALUE | |
− | </ | + | </source> |
− | + | ||
=Beispiel Statement und Hinweise dazu= | =Beispiel Statement und Hinweise dazu= | ||
Hier mal ein SQL CREATE Statement mit einigen meist gebrauchten Kombinationen: | Hier mal ein SQL CREATE Statement mit einigen meist gebrauchten Kombinationen: | ||
− | < | + | <source lang="mysql"> |
CREATE TABLE `tl_sqltest` ( | CREATE TABLE `tl_sqltest` ( | ||
`id` int(10) unsigned NOT NULL auto_increment, | `id` int(10) unsigned NOT NULL auto_increment, | ||
Zeile 35: | Zeile 47: | ||
`decimal_demo1` decimal(20,4) NOT NULL default '100.0000', | `decimal_demo1` decimal(20,4) NOT NULL default '100.0000', | ||
`decimal_demo2` decimal(20,0) NOT NULL default '100', | `decimal_demo2` decimal(20,0) NOT NULL default '100', | ||
+ | `float_demo` float(9,2) unsigned NOT NULL default '0.00', | ||
`varchar_demo1` varchar(32) NOT NULL default 'demo', | `varchar_demo1` varchar(32) NOT NULL default 'demo', | ||
`varchar_demo2` varchar(64) NOT NULL default '', | `varchar_demo2` varchar(64) NOT NULL default '', | ||
Zeile 42: | Zeile 55: | ||
`int_null_demo` int(10) NULL default NULL, | `int_null_demo` int(10) NULL default NULL, | ||
`decimal_null_demo` decimal(20,4) NULL default NULL, | `decimal_null_demo` decimal(20,4) NULL default NULL, | ||
+ | `float_null_demo` float(9,2) unsigned NULL default NULL, | ||
`varchar_null_demo` varchar(32) NULL default NULL, | `varchar_null_demo` varchar(32) NULL default NULL, | ||
`char_null_demo` char(1) NULL default NULL, | `char_null_demo` char(1) NULL default NULL, | ||
`text_null_demo` text NULL, | `text_null_demo` text NULL, | ||
− | ` | + | `timestamp_demo1` timestamp NULL default NULL, |
− | `date_demo` date NOT NULL default '1999-01-01' | + | `timestamp_demo2` timestamp NOT NULL default CURRENT_TIMESTAMP, |
+ | `date_demo` date NOT NULL default '1999-01-01', | ||
PRIMARY KEY (`id`), | PRIMARY KEY (`id`), | ||
+ | KEY `pid` (`pid`), | ||
UNIQUE KEY `varchar_demo1` (`varchar_demo1`), | UNIQUE KEY `varchar_demo1` (`varchar_demo1`), | ||
− | KEY ` | + | UNIQUE KEY `demo1_demo2` (`decimal_demo1`, `decimal_demo2`) |
) ENGINE=MyISAM DEFAULT CHARSET=utf8; | ) ENGINE=MyISAM DEFAULT CHARSET=utf8; | ||
− | </ | + | </source> |
* bei PRIMARY KEY müssen 2 Leerzeichen folgen bevor die runde Klammer folgt | * bei PRIMARY KEY müssen 2 Leerzeichen folgen bevor die runde Klammer folgt | ||
* blob/text Felder (auch die Untertypen tinytext,...) dürfen laut MySQL keinen Default Wert haben, daher ist es hier richtig diesen wegzulassen. | * blob/text Felder (auch die Untertypen tinytext,...) dürfen laut MySQL keinen Default Wert haben, daher ist es hier richtig diesen wegzulassen. | ||
− | * der Name des Unique Keys und des normalen Keys muss identisch sein mit dem Feldnamen der in Klammern steht. | + | * der Name des Unique Keys und des normalen Keys muss identisch sein mit dem Feldnamen der in Klammern steht. (bei Key über ein Feld) |
− | * ein Key der über mehrere Felder angelegt | + | * ein Key der über mehrere Felder angelegt wird, wird von Contao < 2.10 nicht akzeptiert (funktioniert aber), der Name des Keys ist frei wählbar |
* Richtiges Präfix: Contao parst nur Tabellen, die mit dem Präfix "tl_" ausgestattet sind. | * Richtiges Präfix: Contao parst nur Tabellen, die mit dem Präfix "tl_" ausgestattet sind. | ||
+ | * alle SQL Befehle ausser NOT NULL müssen klein geschrieben sein. | ||
+ | * Manchmal hilft auch ein "default ''" für varchar NULL Felder. | ||
+ | |||
+ | =Hinweise für Sequel Pro (Mac) Nutzer= | ||
+ | Folgende Hinweise stammen aus dem Forum und werden hier ohne Bewertung wiedergegeben (hab kein Mac): | ||
+ | |||
+ | Das SQL-Dump, das Sequel Pro (Mac) erzeugt hat, hatte zwei 'Fehler'.<br /> | ||
+ | * DEFAULT (Großbuchstaben) statt default (Kleinbuchstaben) | ||
+ | * AUTO_INCREMENT (Großbuchstaben) statt auto_increment (Kleinbuchstaben) | ||
+ | * nur 1 Leerzeichen nach PRIMARY KEY statt 2 Leerzeichen | ||
+ | |||
+ | Hier sind also Anpassungen nötig. | ||
+ | =Problematik Groß-/Kleinschreibung der Tabellennamen= | ||
+ | Erweiterungen die Tabellen mit Groß-/Kleinschreibung haben, wie z.B. "tl_coinSlider", "tl_coinPictures" oder "tl_FlexiSlider" können Probleme bereiten, besonders unter Windows (XAMPP).<br /> | ||
+ | Grund ist, die Tabellen werden in Kleinschreibung angelegt. Contao stellt dies fest und verlangt erneut ein Datenbank Update.<br /> | ||
+ | Lösbar ist das Problem durch einen Eintrag in der Datei my.ini: | ||
+ | <source lang="ini"> | ||
+ | [mysqld] | ||
+ | lower_case_table_names = 2 | ||
+ | </source> | ||
+ | {{Anmerkung|Es sollte jedoch bei Tabellennamen immer ausschließlich mit Kleinbschreibung gearbeitet werden um solche Probleme zu vermeiden.<br />Nicht jeder kann die my.ini editieren.}} | ||
+ | =Der database.sql Generator= | ||
+ | Nachdem man nun das Grundprinzip verstanden hat, ist man aber doch froh, wenn einem die Arbeit abgenommen wird.<br /> | ||
+ | Dazu dient das Modul: "[[Database.sql_Generator|database.sql Generator]]" | ||
---- | ---- | ||
− | --[[Benutzer:BugBuster|BugBuster]] | + | --[[Benutzer:BugBuster|BugBuster]] 15:21, 3. Sep. 2010 (CEST) |
Aktuelle Version vom 21. November 2013, 18:16 Uhr
Einige Entwickler werden wahrscheinlich das Problem haben, dass die Modultabellen zwar korrekt erzeugt werden, sich aber trotzdem nach der Installation immer noch in der Sektion "Update Database" wiederfinden. Meist liegt das an den implizierten Defaultwerten die von MySQL automatisch erzeugt werden.
betrifft | |
---|---|
TYPOlight Version | ab 2.6 |
Contao Version | ab 2.9 |
Inhaltsverzeichnis
Normalfall
Damit die Tabellen nicht mehr in dieser Sektion erscheinen, macht man einfach folgendes nachdem die Tabelle einmal korrekt angelegt worden ist:
- SQL Mode überprüfen. (Wird bei den meisten nicht relevant sein) Contao arbeitet unter MySQL nicht im Strictmodus, welcher standardmäßig auch aus ist. Einfach im phpMyAdmin oder auf der Konsole eingeben und kontrollieren, dass der Wert leer ist:Wenn nicht leer gibt man folgendes ein:
SHOW VARIABLES LIKE 'sql_mode';
SET sql_mode = '';
- Nun lässt man sich das create statement zurückgeben:tl_MODULE_TABLE_NAME natürlich durch den eigenen Tabellen Namen ersetzen. Dieses Statement ist nun genau so in der database.sql zu verwenden.
SHOW CREATE TABLE tl_MODULE_TABLE_NAME;
Spezialfall
Leider funktioniert das nicht ganz bei Feldern die NULL sein dürfen, Beispiel:
`price` decimal(20,4) NULL , `price2` double(255,0) NULL
MySQL gibt nach obigem Beispiel zurück:
`price` decimal(20,4) default NULL, `price2` double(255,0) default NULL
Beides akzeptiert Contao aber nicht. Dafür die vollständige Variante:
`price` decimal(20,4) NULL default NULL, `price2` double(255,0) NULL default NULL
Hier ist also etwas Nacharbeit nötig.
Andererseits auch einfach zu merken, immer den vollständigen Syntax nehmen:
NAME TYP[(WIDTH, PRECISION, SCALE)] [NOT] NULL default VALUE
Beispiel Statement und Hinweise dazu
Hier mal ein SQL CREATE Statement mit einigen meist gebrauchten Kombinationen:
CREATE TABLE `tl_sqltest` ( `id` int(10) unsigned NOT NULL auto_increment, `pid` int(10) unsigned NOT NULL default '0', `sorting` int(10) unsigned NOT NULL default '0', `tstamp` int(10) unsigned NOT NULL default '0', `decimal_demo1` decimal(20,4) NOT NULL default '100.0000', `decimal_demo2` decimal(20,0) NOT NULL default '100', `float_demo` float(9,2) unsigned NOT NULL default '0.00', `varchar_demo1` varchar(32) NOT NULL default 'demo', `varchar_demo2` varchar(64) NOT NULL default '', `char_demo1` char(1) NOT NULL default 'A', `char_demo2` char(1) NOT NULL default '', `text_demo1` text NOT NULL, `int_null_demo` int(10) NULL default NULL, `decimal_null_demo` decimal(20,4) NULL default NULL, `float_null_demo` float(9,2) unsigned NULL default NULL, `varchar_null_demo` varchar(32) NULL default NULL, `char_null_demo` char(1) NULL default NULL, `text_null_demo` text NULL, `timestamp_demo1` timestamp NULL default NULL, `timestamp_demo2` timestamp NOT NULL default CURRENT_TIMESTAMP, `date_demo` date NOT NULL default '1999-01-01', PRIMARY KEY (`id`), KEY `pid` (`pid`), UNIQUE KEY `varchar_demo1` (`varchar_demo1`), UNIQUE KEY `demo1_demo2` (`decimal_demo1`, `decimal_demo2`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- bei PRIMARY KEY müssen 2 Leerzeichen folgen bevor die runde Klammer folgt
- blob/text Felder (auch die Untertypen tinytext,...) dürfen laut MySQL keinen Default Wert haben, daher ist es hier richtig diesen wegzulassen.
- der Name des Unique Keys und des normalen Keys muss identisch sein mit dem Feldnamen der in Klammern steht. (bei Key über ein Feld)
- ein Key der über mehrere Felder angelegt wird, wird von Contao < 2.10 nicht akzeptiert (funktioniert aber), der Name des Keys ist frei wählbar
- Richtiges Präfix: Contao parst nur Tabellen, die mit dem Präfix "tl_" ausgestattet sind.
- alle SQL Befehle ausser NOT NULL müssen klein geschrieben sein.
- Manchmal hilft auch ein "default " für varchar NULL Felder.
Hinweise für Sequel Pro (Mac) Nutzer
Folgende Hinweise stammen aus dem Forum und werden hier ohne Bewertung wiedergegeben (hab kein Mac):
Das SQL-Dump, das Sequel Pro (Mac) erzeugt hat, hatte zwei 'Fehler'.
- DEFAULT (Großbuchstaben) statt default (Kleinbuchstaben)
- AUTO_INCREMENT (Großbuchstaben) statt auto_increment (Kleinbuchstaben)
- nur 1 Leerzeichen nach PRIMARY KEY statt 2 Leerzeichen
Hier sind also Anpassungen nötig.
Problematik Groß-/Kleinschreibung der Tabellennamen
Erweiterungen die Tabellen mit Groß-/Kleinschreibung haben, wie z.B. "tl_coinSlider", "tl_coinPictures" oder "tl_FlexiSlider" können Probleme bereiten, besonders unter Windows (XAMPP).
Grund ist, die Tabellen werden in Kleinschreibung angelegt. Contao stellt dies fest und verlangt erneut ein Datenbank Update.
Lösbar ist das Problem durch einen Eintrag in der Datei my.ini:
[mysqld] lower_case_table_names = 2
Der database.sql Generator
Nachdem man nun das Grundprinzip verstanden hat, ist man aber doch froh, wenn einem die Arbeit abgenommen wird.
Dazu dient das Modul: "database.sql Generator"
--BugBuster 15:21, 3. Sep. 2010 (CEST)
Nicht jeder kann die my.ini editieren.