MySQL Workbench - Fremdschlüsselbeziehung

Ludwigmller

SQL-Guru
Beiträge
171
Wenn ich über die Konsole einen Datensatz einfügen möchte der im Fremdschlüsselattribut einen Wert hat der in der referenzierten Tabelle nicht vorhanden ist, bekomme ich die Meldung das die Fremdschlüsselbeziehung fehl schlug. Über die grafische Oberfläche der MySQL Workbench kann ich jedoch diesen Datensatz einfach einfügen. Woran liegt das?
 
Werbung:
Das Verhalten der DB bzgl. eines Foreign Key Constraints ist unabhängig vom verwendeten Client. Zumindest sollte dies so sein. Bei MySQL gibt es diverse Schalter, um bereits an sich regelunkonformes Verhalten zu verschlimmbessern. Siehe z.B. laxes Verhalten bzgl. Aggregationen, Verhalten von NOT NULL - Spalten, Check-Constraints etc. Möglicherweise bedient sich die Workbench eines solchen Tricks.

Ich empfehle den Einsatz einer funktionierenden Datenbank, es geht ja um die sichere und konsistente Speicherung von vermutlich wichtigen Daten. MySQL ist Müll und daher für sowas ungeeignet.
 
Da ja doch einige große Unternehmen MySQL nutzen kann ich mir eigentlich nicht vorstellen dass es so schlecht ist wie du beschreibst.
Aber generell überlege ich sowieso auf postgreSQL umzusteigen. Wie aufwendig ist die Umgewöhnung? Was sind Dinge die anders sind?
 
Wie aufwendig ist die Umgewöhnung? Was sind Dinge die anders sind?

PostgreSQL ist halt a) sauberer in der Implemetierung und b) reichhaltiger in den Features. Mit dem Wissen über Abfragen etc. aus MySQL kommst Du auch in PG sofort zurecht; ein Umstieg von PG auf MySQL würde Dich vermutlich zum Suizid treiben, weil aus dieser Perspektive nichts wie gewoht funktioniert, keine Featurs vorhanden sind und alles voller Bugs ist.

Viel Erfolg!
 
Da ja doch einige große Unternehmen MySQL nutzen kann ich mir eigentlich nicht vorstellen dass es so schlecht ist wie du beschreibst.

Naja, sagen wir es mal so: von allen Alternativen ist MySQL wirklich die Schlechteste. Mit der Version 8.0 haben sie zwar aufgeholt, aber es fehlen immer noch viele Sachen, die man in anderen Datenbank (wie Postgres) letztendlich als selbstverständlich erachtet. Siehe z.B. hier: https://stackoverflow.com/a/8182996

Die meisten Unternehmen nehmen MySQL "weil's halt da ist" und überlegen nicht wirklich, bzw. die Entscheidungsträger können die technischen Konsequenzen oft gar nicht abwägen. Und wenn's alle anderen machen, kann's ja so schlecht nicht sein...
Dass die bei den meisten Domain-Hoster nur MySQL als Datenbank zur Verfügung stellt hat da sicherlich seinen Teil beigetragen.

Außerdem war Postgres lange nicht für Windows verfügbar. Man kann von Windows halten was man will, aber es ist halt immer noch das dominante Betriebssystem auf dem Desktop - früher noch mehr als heute. Und im Zweifelsfall hat der Entwickler dann halt eine Datenbank genommen, die unter Windows (leicht) installierbar war.

Was ich eine nette Anekdote finde: der Execution Plan in MySQL war - wenn man andere Datenbanken kennt - eigentlich immer ein Witz. Letztendlich stand da nie wirklich viel drin.
Mit der Version 8.0.20 (einem Bugfix Release! - die Versionspolitik von MySQL finde ich auch etwas fragwürdig) wurde die Ausgabe und der Detailgrad gründlich überarbeitet und sieht jetzt aus wie der von Postgres ;)

Andererseits ist MySQL auch nicht ganz sooo schlecht wie akretschmer das immer hinstellt (check constraints, window functions, rekursive Abfragen sind z.B. in 8.0 endlich dazu gekommen - in Postgres und anderen Datenbanken hat man das schon seit Jahrzehnten verwenden können).

Es scheint so, dass sich die Qualität nach der Übernahmen durch Oracle etwas verbessert hat (sowas wie der berüchtigte Post von Monty Oops, we did it again kommt wohl nicht mehr vor), aber ich habe immer noch das Gefühl, dass da deutlich weniger getestet wird als bei Postgres. Wie gesagt, dass ist ein Gefühl - glücklicherweise muss ich so gut wie gar nicht mehr mit MySQL arbeiten.

Auf HackerNews hat es vor ein paar Monaten mal eine Diskussion gegeben warum die Binaries von Postgres um so vieles kleiner sind als die von MySQL (z.B. mysqld.exe 45MB, postgres.exe 7MB - ich glaube unter Linux ist das Verhältnis ähnlich). Viele waren der Meinung, dass es einfach daran liegt, dass die Postgres Entwickler wesentlich mehr Wert auf Code-Qualität legen und eben alte Zöpfe die nicht mehr sinnvoll gepflegt werden können auch abschneiden und neu machen.

Irgendjemand hat mal die Entwicklungsansätze so verglichen: bei MySQL wird zuerst darauf geachtet, dass die Dinge schnell sind (weil sich das im "Marketing" besser macht). An zweiter Stelle kommt die Korrektheit der Implementierung, und als Letztes dann die Sicherheit der Daten. Bei Postgres liegt die allererste Priorität auf der Sicherheit der Daten, dann kommt die Korrektheit, und wenn alles stabil und richtig läuft wird es schneller gemacht.
 
So hab mir jetzt mal postgres heruntergeladen. Leider habe ich Probleme mit der Kodierung: "Konsolencodeseite (850) unterscheidet sich von der Windows-Codeseite (1252). 8-Bit-Zeichen funktionieren möglicherweise nicht richtig." Der Befehl aus dem Handbuch "\c chcp 1252" verlangt ein Passwort für Benutzer 1252. Wer und was ist das ?
Ist es richtig dass es den Befehl "SHOW TABLES" und "USE datebase_name" nicht gibt? Ich dachte bei postgres gibt es mehr als bei MySQL ;)
 
Werbung:
Die Warnung bezieht sich auf die Anzeige in der Konsole (cmd.exe) und wird erst interessant wenn Du Unicode Zeichen anzeigen willst.

Das Äquivalent zu "show tables" in psql ist \d

Was MySQL "database" nennt, ist in Wirklichkeit ein Schema (zumindest so wie es im SQL Standard definiert ist). Postgres kennt beides: Datenbanken und Schemata. Eine Postgres Instanz kann viele Datenbanken enthalten und eine Datenbank kann viele Schemata enthalten. Eine "Datenbank" in Postgres ist also etwas komplett anderes als in MySQL (und wie gesagt: im Grunde hat MySQL das Konzept einer "Datenbank" gar nicht)

In den meisten Fällen wird man bei einer Migration von MySQL nach Postgres die Datenbanken auf Schemata mappen. Vor allem dann, wenn Abfragen über Tabellen in verschiedenen Schemata (="database" in MySQL) gemacht werden.

Im Handuch steht der Befehl ""\c chcp 1252"" garantiert nicht drin. "chcp" ist ein Windows Kommandozeilen Tool welches die aktive Codepage der Konsole (cmd.exe) ändert. Es hat nichts mit Postgres (oder psql) zu tun und muss natürlich außerhalb von psql ausgeführt werden.

Aber diese Diskussion sollten wir vermutlich im Postgres Unterforum weiterführen.
 
Zurück
Oben