[SQL allgemein] leere strings verbieten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [SQL allgemein] leere strings verbieten

    hi

    ist es denn möglich beim erstellen einer tabelle für eine spalte anzugeben, das man keine leeren strings einfügen darf. also nicht NULL sonder ""

    ich will einfach verhindern das jemand ausversehen leere einträge macht. aber bisher habe ich nichts gefunden womit das gehen könnte. man kann es zwar mit php oder javascript abfragen, aber es wäre schöner es direkt an der quelle zu verbieten

    habt ihr ne idee? danke!

  • #2
    http://dev.mysql.com/doc/refman/5.1/...e-trigger.html

    Kommentar


    • #3
      ok also ich weis jetzt wie man den trigger erstellt. aber wie sieht die abfrage aus die ich dann machen muss.
      Code:
      CREATE TRIGGER triggername
      BEFORE INSERT ON tabellenname
      FOR EACH ROW IF(spaltenname='') EXIT
      so ähnlich???

      ich hab grad noch woanders gelesen, das es auch eine check funktion gibt, die man direkt hinter der spalte einfügen kann. aber ich kann in der mysql doku nichts darüber finden. kann es sein das die doku ziemlicher mist ist? man findet irgendwie nie was man sucht
      Zuletzt geändert von sql_newbie_67; 14.11.2008, 20:21.

      Kommentar


      • #4
        CHECK kannst du vergessen, denn AFAIK es wird nicht beachtet bei allen storage engines.

        TRIGGER würde ich AFTER INSERT prüfen und ggf. löschen, denn BEFORE nützt dir nichts, es sei denn du packst dein INSERT in einer Transaction, dann kannst du in BEFORE INSERT ein Variable setzten und anschliessend abhängig davon entweder COMMIT oder ROLLBACK ausführt.

        Kommentar


        • #5
          Wenn man es direkt beim CREATE TABLE an die Spaltendefinition anhängen kann, dann findet man es hier bei CREATE TABLE. Dort liest man aber "The CHECK clause is parsed but ignored by all storage engines." Bringt dir also nichts.

          So ein EXIT wie in deinem Beispiel gibt es nicht. Das INSERT wird auf jeden Fall ausgeführt. Es sei denn, es tritt ein Fehler auf.
          Diesen Umstand mußt du ausnutzen. Du mußt einen Fehler provozieren. Wie das geht (und wie man dabei sogar eine sinnvolle Fehlermeldung bekommen kann), wird hier beschrieben.

          Wenn du es so machst, wie asp2php vorgeschlagen hat, weiß deine Applikation nicht, dass die Daten nicht (mehr) in der DB sind.

          Kommentar


          • #6
            okay. und wie genau würde der befehl dann aussehen?

            Code:
            CREATE TRIGGER triggername
            AFTER INSERT ON tabellenname
            FOR EACH ROW DELETE FROM tabellenname where spaltenname=''
            Zuletzt geändert von sql_newbie_67; 14.11.2008, 22:03.

            Kommentar


            • #7
              Wozu versuchst du Teile der Programmlogik in die Datenbank auszulagern? Das macht alles doch nur unnötig kompliziert und fehleranfällig.

              Kommentar


              • #8
                naja ich bin noch kein profi in sachen datenbank, und dachte, GERADE weil ich in der datenbank explizit dinge verbiete, vermeide ich eventuell fehler, zb indem ich in php vergesse eine abfrage zu machen

                die tatsache, das das aber anscheinend niemand so zu machen scheint macht mich doch etwas stutzig

                Kommentar


                • #9
                  Wenn du es in PHP vergisst, aber PHP glaubt, dass der Eintrag erfolgreich war, können die merkwürdigsten Situationen entstehen. zB. PHP sagt "alles OK", aber Eintrag ist nicht in der Datenbank. Was machst du jetzt? Du musst sowohl die Logik in der Datenbank als auch die Logik im Programm auf Fehler überprüfen => doppelter Aufwand.

                  Oder was ist, wenn sich die Überprüfungen widersprechen? zB. du kommst irgendwann mal drauf, dass du eine Überprüfung ändern willst (zb. Felder dürfen jetzt doch leere Strings enthalten). Dann musst du es sowohl im PHP-Code, als auch in der Datenbank ändern => doppelter Aufwand, doppelte Fehlerquelle. Du könntest auf einer Seite darauf vergessen oder irrtümlich was falsches eintragen. Der Fehler fällt nicht sofort auf, weil PHP nicht unbedingt eine Fehlermeldung werfen muss.

                  Kommentar


                  • #10
                    Lass dir nix einreden...
                    Oberstes Ziel einer Datenbank sollte dessen Integrität sein.

                    Das MySQL derartige Dinge nur unzureichend unterstützt ist ein echtes Manko!
                    Aber gerade weil es nur so unzureichend unterstützt wird, würde ich es bei MySQL echt sein lassen... ggf. ein paar Transaktionen verwenden und den Rest per PHP machen.

                    Wenn die Datenbank jedoch vernünftige Constraints/Checks anbieten würde, wie es z.B. bei PostgreSQL oder Oracle der Fall ist, sollte man das in jedem Fall nutzen!
                    Der Zeitaufwand um einen Fehler in der Applikation zu finden ist deutlich geringer, als Daten wieder konsistent zu bringen, weil die Applikation aufgrund eines Fehlers munter falsche Daten in die DB geschoben hat.
                    Mal ganz abgesehen davon, dass es Datenbanken gibt, die von mehreren Applikationen verwendet werden. Da wäre es schon fast fahrlässig jeder Applikation intern das Prüfen auf Konsistenz aufzuerlegen... die sind niemals alle auf dem gleichen Level.

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      ich bin davon ausgegangen das es halt einen ganz simplen befehl gibt, so wie check. und das dann im falle der verletzung ein fehlercode zurückgegeben wird den ich mit php dann weiterverarbeiten kann. das wäre für mich die denkbar sauberste variante

                      aber anscheinend gibt es so eine funktion nicht. der tip von onemorenerd kann zwar klappen, aber ich fühl mich nicht so wohl dabei.

                      ich denke einfach, wenn man erst so einen komplizierten weg gehen muss um so eine einfache sache zu erreichen, dann kann das nicht so gut sein

                      also was soll ich machen? einfach in php die abfrage machen?

                      Lass dir nix einreden... Oberstes Ziel einer Datenbank sollte dessen Integrität sein. Das MySQL derartige Dinge nur unzureichend unterstützt ist ein echtes Manko! Aber gerade weil es nur so unzureichend unterstützt wird, würde ich es bei MySQL echt sein lassen... ggf. ein paar Transaktionen verwenden und den Rest per PHP machen. Wenn die Datenbank jedoch vernünftige Constraints/Checks anbieten würde, wie es z.B. bei PostgreSQL oder Oracle der Fall ist, sollte man das in jedem Fall nutzen! Der Zeitaufwand um einen Fehler in der Applikation zu finden ist deutlich geringer, als Daten wieder konsistent zu bringen, weil die Applikation aufgrund eines Fehlers munter falsche Daten in die DB geschoben hat. Mal ganz abgesehen davon, dass es Datenbanken gibt, die von mehreren Applikationen verwendet werden. Da wäre es schon fast fahrlässig jeder Applikation intern das Prüfen auf Konsistenz aufzuerlegen... die sind niemals alle auf dem gleichen Level.
                      ich dachte immer mysql wäre die absolute referenz in sachen datenbanken. ist dem dann etwa nicht so? wieso werden solche einfachen sachen nicht unterstützt lohnt es sich auf zb postgresql umzusatteln?
                      Zuletzt geändert von sql_newbie_67; 14.11.2008, 22:39.

                      Kommentar


                      • #12
                        Original geschrieben von sql_newbie_67

                        ich dachte immer mysql wäre die absolute referent in sachen datenbanken...
                        Hahaha ... das ist der beste Witz des Tages

                        ... andere DBMS nehmen ... dann hast du mehr vom Leben

                        Kommentar


                        • #13
                          nunja überall hört und sieht man von mysql, somit denkt man sich, das verwenden alle und das muss das beste sein. aber ich fange langsam an zu zweifeln

                          Kommentar


                          • #14
                            Original geschrieben von sql_newbie_67
                            nunja überall hört und sieht man von mysql, somit denkt man sich, das verwenden alle und das muss das beste sein. aber ich fange langsam an zu zweifeln
                            Das kommt davon weil MySQL für die meisten Provider einfach zu handhaben ist und daher bei jedem Webspace angeboten wird und somit ziemlich weit verbreitet. Aber das Ding hat nicht alles, was eine anspruchvolle Applikation braucht. Doch für eine Website reicht es alle mal.

                            Kommentar


                            • #15
                              Original geschrieben von asp2php
                              Aber das Ding hat nicht alles, was eine anspruchvolle Applikation braucht. Doch für eine Website reicht es alle mal.
                              Also ich stoße auch bei Websiten mehr oder weniger regelmäßig auf Dinge, die ich vermisse...

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar

                              Lädt...
                              X