Simone: UNIQUE Problem bei mediumtext

Hallo,

Ich habe eine Anfänger - Mysql - Frage ;o)

Ich möchte eine Spalte (mediumtext) auf UNIQUE setzen.
Geht aber nicht!
Mit dem Spaltentyp varchar(255) komme ich nicht hin weil die zukünftigen Einträge diese Längenbegrenzung überschreiten. Dennoch möchte ich den Spaltentyp auf UNIQUE setzen um doppelte Einträge ohne Gegenprüfung einzutragen.

Wie kann ich das umsetzen?

Fehlermeldung:
ALTER TABLE titeltb ADD UNIQUE (
titel
)

MySQL meldet:
#1170 - BLOB column 'titel' used in key specification without a key length

Danke Simone

  1. Hallo,

    CREATE TABLE titel (
      id int(9) NOT NULL auto_increment,
      titel longtext NOT NULL,
      keyword text NOT NULL,
      PRIMARY KEY  (id),
      UNIQUE KEY titel (titel(255))
    ) TYPE=MyISAM AUTO_INCREMENT=1 ;

    hab's hinbekommen, mich freu!

    sind jedoch auch nur die ersten 255 Zeichen!

    Simone

  2. Moin!

    Ich möchte eine Spalte (mediumtext) auf UNIQUE setzen.
    Geht aber nicht!

    Das ist auch gut so. Denn auf Spalten mit MEDIUMTEXT einen Index setzen zu wollen ist unsinnig.

    MySQL erlaubt es, auf die ersten X (bis zu 255) Zeichen solch eines Feldes einen Index zu setzen. Diese Längenangabe fehlt bei dir. Allerdings sagt das Manual nichts über UNIQUE Indices aus, und ich bezweifle auch, dass es sinnvoll ist, sicherzustellen, dass die ersten 255 (oder 1000) Zeichen eindeutig sind, wenn danach noch Zeichen folgen können.

    Mediumtext erlaubt 16 Megabyte Text - solche Feldlängen sind (komplett)indexmäßig nur noch über einen Volltext-Index sinnvoll indizierbar, der dir bei deiner vermuteten Aufgabe aber nicht hilft.

    Mit dem Spaltentyp varchar(255) komme ich nicht hin weil die zukünftigen Einträge diese Längenbegrenzung überschreiten. Dennoch möchte ich den Spaltentyp auf UNIQUE setzen um doppelte Einträge ohne Gegenprüfung einzutragen.

    Bist du sicher, dass du den Sinn von UNIQUE verstanden hast?

    In einer UNIQUE-Spalte kann kein Feldinhalt doppelt vorkommen. Solche Spalten sind typischerweise relevant für eindeutige Schlüssel. Auch _mit_ Gegenprüfung könntest du niemals zwei identische Werte in diese Spalte eintragen.

    UNIQUE ist eine absichtliche Behinderung des beliebigen, freien Eintragens in die DB, um doppelte Feldinhalte sicher zu verhindern, ohne dass sich die eintragende Applikation darum kümmern muß.

    UNIQUE-Indices können auch über mehrere Spalten gehen und so das mehrfache Auftreten der gleichen Inhaltskombination verhindern.

    Sofern du aber tatsächlich MEDIUMTEXT mit UNIQUE behandeln willst, frage ich mich, was genau du da vor hast. Mit Sicherheit willst du etwas tun, was man besser anders löst. Also erzähle mal etwas umfassender, was dein Problem ist und was du tun willst.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo, Sven Rautenberg

      Sofern du aber tatsächlich MEDIUMTEXT mit UNIQUE behandeln willst, frage ich mich, was genau du da vor hast. Mit Sicherheit willst du etwas tun, was man besser anders löst. Also erzähle mal etwas umfassender, was dein Problem ist und was du tun willst.

      Ich bin dabei einen kleinen Buchshop zu modellieren (amazon-api).
      In dieser Unique-Tabelle möchte ich eindeutige Buchtitel "sammeln" und eine mehrfach Erfassung vermeiden. Es ist zwar nicht die ganz saubere Lösung ("Mysql Duplikate Fehler") Aber dennoch die schnellste Möglichkeit ohne viele Prüfschleifen.

      Ps: danke für Deine Mysql Einführung ;o)

      Simone

      1. Moin!

        Ich bin dabei einen kleinen Buchshop zu modellieren (amazon-api).
        In dieser Unique-Tabelle möchte ich eindeutige Buchtitel "sammeln" und eine mehrfach Erfassung vermeiden. Es ist zwar nicht die ganz saubere Lösung ("Mysql Duplikate Fehler") Aber dennoch die schnellste Möglichkeit ohne viele Prüfschleifen.

        Ein eindeutiger und deshalb wesentlich besserer Schlüssel ist die ISBN-Nummer oder (wenn du schon auf Amazon bezug nimmst) die Amazon-Bestellnummer (sofern das was anderes ist, als die ISBN).

        Mit dem Buchtitel hingegen würde ich keinesfalls eine UNIQUE-Tabelle machen. Wenn es die Erfasser mental überfordert, zuerst die ISBN einzugeben, damit dein System sehen kann, ob die schon erfaßt ist, dann sollte dein System eben die erfaßten Buchtitel ausgeben und dem Erfasser die Möglichkeit geben, nachzusehen, ob einer der möglichen Buchtitel schon erfaßt wurde.

        Mit einem UNIQUE-Buchtitel handelst du dir nämlich mehr Probleme ein, als dir im Moment klar sein könnte.

        Das fängt bei der Möglichkeit an, dass es Hardcover- und Taschenbuchausgaben desselben Werks gibt, die natürlich unterschiedliche Bücher sind, aber gewöhnlich den gleichen Titel haben. Das geht weiter mit der Möglichkeit unterschiedlicher Ausgaben desselben Buchtyps (der Duden beispielsweise oder auch Lexikons erscheinen in gewissen Abständen neu, behalten aber natürlich ihren identischen Titel), was zugegeben nur relevant ist, wenn man ein tatsächliches Archiv zu pflegen hat.

        Und zu guter letzt gibt es schlicht auch die Möglichkeit, dass grundverschiedene Bücher einfach zufällig den gleichen Titel haben. Autobiographien beispielsweise werden oft "Mein Leben" genannt, was weder sonderlich kreativ noch sehr unterscheidungskräftig ist.

        Aber weder das Erscheinungsjahr noch der Autorenname sind Bestandteil des Titels eines Buches und müßten, wenn all die genannten unterschiedlichen Bücher in deiner Datenbank eindeutig erfaßt werden sollen, von allen Erfassern immer in der gleichen Art und Weise, insbesondere in der identischen Schreibweise (vor allem, was diakritische Zeichen, Satzzeichen etc. angeht) eingegeben werden. So etwas halte ich aber für absolut ausgeschlossen.

        Die ISBN ist daher ein zentral vergebenes, sehr leicht erkenn- und prüfbares Kennzeichen eines Buches, welches Duplikate bei der Erfassung viel wirksamer verhindert.

        Abgesehen davon ist deine jetzige Lösung ja auch keine wirkliche. Nur die ersten 255 Zeichen des Titels gehen in den UNIQUE-Index ein. Wenn zwei unterschiedliche Bücher sich erst nach dem 255. Zeichen unterscheiden, wird dein Mechanismus den Erfasser nicht nur diesen Wahnsinnstitel einmal komplett abtippen lassen, sondern auch noch falschen Alarm geben und die Erfassung verweigern.

        Abgesehen davon: MEDIUMTEXT - warum bitte 16 MB mögliche Titellänge? Wenn ein VARCHAR(255) es nicht tut, wäre als nächste Stufe TEXT (mit 64 KB Maximallänge) angebracht gewesen. Schließlich willst du im Titelfeld ja nicht gleich den gesamten Buchinhalt speichern, oder?

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Hallo Sven Rautenberg

          Ich bedanke mich für Deine Antwort.

          Wie ich aus Deinen Ausführungen entnehme ist Dir die Strukturierung der API nicht unbekannt. Deine Lösungsansätze sind nachvollziehbar (ISBN NR). Jedoch habe ich mein Projekt in eine andere Richtung ausgerichtet. Mir geht es um eine textlinguistische Auswertung der verfügbaren Bücher anhand des Buchtitels und weiteren nutzbaren Merkmalen.
          Die Titeltabelle sollte demnach nur als Rand() Tabelle fungieren in Hinsicht auf eine Datenbankabfrage.

          Simone

          1. 你好 Simone,

            nichtsdestotrotz sind Buchtitel nicht Unique. Es gibt Bücher mit
            verschiedenen Inhalten, die denselben Titel haben. Den Titel mit einem
            Unique-Constraint zu belegen entspricht nicht der Natur.

            再见,
             克里斯蒂安

            --
            Toilettenspruch II. | Toilettenspruch I.
            So, wie ein Teil ist, ist das Ganze.
            http://wwwtech.de/
          2. echo $begrüßung;

            Wenn dich schon Svens Ratschläge nicht von deinem Vorhaben abhalten ...

            Eine Möglichkeit wäre, eine weitere Spalte hinzuzufügen, in der du den MD5-Wert des Titels ablegst. Der ist nur 32 Zeichen lang, ein Unique-Index ist also kein Problem.

            Allerdings will ich auch nicht die mir einfallenden Nachteile verschweigen:

            Die MD5-Wert-Spalte ist von deiner Anwendung zu verwalten. Beim Einfügen von Datensätzen und beim Ändern des Titels musst du dafür sorgen, dass ein MD5-Wert in diese Spalte gelangt. Trigger, die das in der Datenbank erledigen könnten, stehen erst ab MySQL 5.x zur Verfügung. (MySQL bietet aber eine MD5-Funktion an.)

            Die "duplicate-value"-Meldung bemängelt die MD5-Spalte, nicht den Titel. Das könnte etwas verwirrend sein, wenn du diese Fehlermeldung an uneingeweihte Anwender weiterreichst.

            MD5 unterscheidet zwischen Groß- und Kleinschreibung. "das" und "Das" ergeben unterschiedliche MD5-Werte. Die MySQL-Funktionen LOWER() oder UPPER() könnten aber hilfreich sein.

            echo "$verabschiedung $name";