CHECK Klausel über ALTER TABLE hinzufügen

Ludwigmller

SQL-Guru
Beiträge
168
Hallo,
ich möchte nachträglich eine Check-Klausel hinzufügen. Dies habe ich folgendermaßen versucht:

Code:
ALTER TABLE
    t1 ADD CONSTRAINT TestConstr
CHECK
    (Spalte1> 0)

Leider bekomme ich die Fehlermeldung: "Eine neue Anweisung wurde gefunden, aber kein Trennzeichen zwischen ihm und dem vorhergehenden." Sowie dass das Erstellen fehlgeschlagen ist.
Wo liegt der Fehler? Kann man so etwas auch graphisch in phpmyadmin machen?
 
Werbung:
Ist doch völlig egal, MySQL kann eh keine Check-Constraints einhalten:

Code:
mysql> create table foo ( i int check (i > 0));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo values (10);
Query OK, 1 row affected (0.01 sec)

mysql> insert into foo values (-10);
Query OK, 1 row affected (0.01 sec)

mysql> select * from foo;
+------+
| i    |
+------+
|   10 |
|  -10 |
+------+
2 rows in set (0.00 sec)

mysql>




Korrekt wäre dies:

Code:
test=*# create table foo ( i int check (i > 0));
CREATE TABLE
test=*# insert into foo values (10);
INSERT 0 1
test=*# insert into foo values (-10);
ERROR:  new row for relation "foo" violates check constraint "foo_i_check"
DETAIL:  Failing row contains (-10).
test=*# select * from foo;
 i  
----
 10
(1 row)

test=*#

Das ist aber auch kein MySQL, sondern PostgreSQL.


select kaffee;
 
Code:
test=*# create table foo ( i int);
CREATE TABLE
test=*# alter table foo add constraint check_i check (i > 0);
ALTER TABLE

du hast vermutlich nur das Trennzeichen vergessen. Ein seltener Fall einer hilfreichen MySQL-Fehlermeldung.
 
Welche Vorteile mySQL hat?
Dazu kann ich nichts sagen, ich frage mich immer, warum es so viel genutzt wird.

Wahrscheinlich ist es eine Mischung aus Tradition und dass jeder Provider es einem nach wirft, also Verbreitungsgrad inkl. einem unendlichen Haufen oft total veralteter Code Schnipsel. Das meiste für die Tonne.

Eigentlich ist schon vergeudete Zeit, darüber nachzudenken oder zu schreiben.

Oder wolltst Du die Vorteile von pg wissen?
 
fangen wir mal einfach an: check-constraints funktionieren.
ach komm, ich wollte gerade auf Dich verweise, da geht noch was!

Nagut, was fällt einem Anfänger so auf? Etwas spekulativ. Das Gemeine ist ja, dass man als Anfänger nicht einfach beurteilen kann, was schief geht oder was gehen könnte. Schreibt man gerade Blödsinn oder macht die DB einen Fehler? Muss man das alles selber machen oder gibt es das auch in fertig? Als ich mit SQL angefangen habe, habe ich öfter mal gedacht, hey, ich habe einen Bug entdeckt. Im Laufe von 20 Jahren war es dann doch nur 1 einziger. Die restlichen „Bugs“ gingen aufs Haus.

Also dieser Thread hier ist ja wie schon gesagt das erste lebende Beispiel.

Postgres kann Fehlermeldungen, recht präzise.
Postgres kann constraints, nicht nur PK, FK
Postgres kann Group By, also sowohl richtige Daten ausgeben als auch korrekte Fehlermeldungen liefern, wenn das Statement falsch geschrieben wurde.
Postgres kann sehr gut programmiert werden. Also echte, mächtige Programme oder sagen wir Prozeduren bzw. Funktionen.
Postgres ist sehr Typen-freudig.
(auch hier, es kommt auf die Sorte Anfänger an,
a) ich schreibe auch ein Datum in einen Texttyp- who cares oder
b) selbst bei Ganzzahlen schaue ich schon genau auf die nötige Integer Größe.)
Postgres kann ziemlich einfach explizite Typanweisungen verarbeiten (wenn nötig) oder sogar Deine eigenen nutzen
Postgres kann Range Typen!
Postgres wird regelmäßig aktualisiert und erweitert. (Davon merkt ein mySQL Nutzer jahrelang nicths.) Ich glaub im November kommt die neue pg Version 13. Schau Dir dagegen die mySQL Versionsgeschichte auf wikipedia an, das sind wirklich geschichtliche Zeiträume.
Postgres hat eine sehr ausgereifte (ISO Standard nahe) Syntax, man lernt weniger proprietäres Zeug
Postgres hat eine mächtigere Syntax, man braucht nicht ständig Workarounds
Postgres hat ein stabiles Extension System mit einer Fülle von Erweiterungen (siehe GIS- nur eine davon), einfach mit einem Befehl die Extension anlegen und sie ist nutzbar
Postgres hat keine Lizenzfallen (merkt man anderswo erst, wenn es weh tut bzw. viel Geld kostet oder beides)
..

es gibt hier wie gesagt Postgres Experten, die das sicher aus dem Ärmel ergänzen könnten

Du kannst natürlich die Suchfunktion nutzen, erst neulich war hier irgendwo die Frage MSSQL oder Postgres mit guten Infos. (MSSQL ist eine teure Kaufsoftware wie es sie von mySQL auch als Variante gibt, wenn Du das Geld ausgibst, merkst Du schon eher, was mySQL sein könnte). Die ernsthafte Frage nach Postgres oder MSSQL sagt schon ohne Antworten viel.

Du kannst auch einfach wechseln, es tut nicht weh. Wenn Du schon bestehendes SQL hast, gibt es sicher ein paar Hänger, aber das macht man einmal und dann ist Ruhe.
Vielleicht gibt es sogar Kompatibilitäts Extension(s), das weiß ich nicht aus dem Kopf.
 
Das klingt ja alles super...
Ich hab mal eben eine Test PG Datenbank erstellt und mit pgAdmin vergeblich versucht eine Tabelle zu erstellen. Die Fehlermeldung war nichts sagen... Also auf dem ersten Blick gefiel mir phpmyadmin besser, da du funktioniert alles intuitiv
 
Ich kann mir auch keinen Grund vorstellen, warum man MySQL gegenüber Postgres vorziehen sollte.

Aber die aktuelle MySQL Version unterstützt check constraints - da sollte man schon fair bleiben.

MySQL 8.0 | db<>fiddle

Ich hab mal eben eine Test PG Datenbank erstellt und mit pgAdmin vergeblich versucht eine Tabelle zu erstellen. Die Fehlermeldung war nichts sagen
Tabellen erstellt man auch besser mit SQL (CREATE TABLE), nicht mit irgendwelchen graphischen "Formularen".

Aber ich muss Dir recht geben: pgAdmin ist wirklich nicht so toll. Ist leider kein gutes Aushängeschild für Postgres. Aber es gibt ja glücklicherweise einen Haufen anderer Tools, und letztendlich sollten die Features der Datenbank - nicht die der Tools - entscheiden, welche Datenbank man einsetzt.
 
Das klingt ja alles super...
Ist es auch! :)

Wir haben ja über die Vorteile von Postgres gesprochen. Was soll ich zu Deinem "anonymen" Einwand zu irgendeinem tool sagen? (Du kannst Dir vielleicht denken, dass ich es nicht nutze) Am Ende ist eine IDE irrelevant, wenn die DB nicht das macht, was sie soll oder es nicht mal kann.
Es gibt ja auch Leute, die sich jahrzehnte über ihre teure WYSIWYG Textverarbeitung aufregen, aber sich nicht trauen, die gewohnten Fehler hinter sich zu lassen.

Meinst Du vielleicht Gewohnheit statt Intuition?
Ach, ich weiß nicht, ich nutze auch nicht pgAdmin. Probier mal DBeaver. Oder nimm die Kommandozeile, das ist grad im Trend. (ändert natürlich nichts an der Fehlermeldung)
Die kann man übrigens nachschlagen und mehr zu ihrer Bedeutung erfahren.

Was die Datenbank angeht, für Postgres wäre ein weiterer Vorteil, dass Du in den Foren immer solide Hilfe bekommst.
 
Werbung:
Ja, Du hast Recht. Spricht das nun für mySQL? Oder noch mehr auf die Frage bezogen, gegen andere DB?
Ich bezog mich auf die von Dir zurecht angemahnte Fairness, dass es ja "nun" (seit 2019) geht. Davor ging es nicht und diese Version sind nun mal noch verbreitet. Mir persönlich ist es ziemlich egal, ob es mit oder ohne Fehlermeldung nicht geht. Nein eigentlich auch nicht, lieber mit Fehlermeldung.
Den Group By Fehler könnte man auch durch irgendeinen Parameter seit irgendwann abstellen. Es macht aber kein Anfänger und alle quälen sich mit diesem Mist rum.
 
Zurück
Oben