Mysql - doppelten Eintrag vermeiden

...komplette Frage anzeigen

5 Antworten

Das Doppelt muss sich doch auf etwas beziehen. Wenn Du einen Primärschlüssel hast, kannst einen doppelten Eintrag gar nicht erstellen, da sich der Satz ja schon in der id unterscheidet. Wenn es sich auf ein bestimmtes Feld beziehen soll, so musst Du das in der Datenbankstruktur festlegen. Du brauchst eine Konzept, einen Plan, was und wie die Datenbank etwas machen soll. Von alleine macht die nichts. Da muss minutiös genau alles festgelegt werden. Man kann die Daten nicht wie Müll in die Datenbank kippen und erwarten, dass da was richtig funktioniert.

Unique dient dazu, für bestimmte Spalten oder auch Gruppen von Spalten als eindeutig zu definieren. Das musst der Datenbank mitteilen, dass Du das so haben willst. Das geht, indem Du auf diese Felder einen Uniqueindex legst. Zwei Felder, wie hier Test1 und Test2 kann man als unterschiedliche Spalten überhaupt nicht gemeinsam eindeutig machen. Das macht normalerweise auch keinen Sinn. Wenn Du das aus irgendeinem Grund so brauchst, musst Du diese Felder in eine eigene Tabelle auslagern und dort die Eindeutigkeit überwachen lassen.

Wenn ein Feld eindeutig sein soll, muss es ja einen Grund dafür geben. Dieser Grund muss in der Datenbank ja irgendwie zum Ausdruck kommen, z. B. als Primärschlüssel in einer Stammdaten-Tabelle. Im Gegensatz dazu gibt es Bewegungsdaten wie etwa eine Rechnungstabelle. Dort ist es normal, dass zwei Kunden den gleichen Artikel gekauft haben. Bei den Artikel-Stammdaten dagegen darf jede Artikel-Nr nur einmal vorkommen. Da können auch mehrere Artikel den gleichen Preis haben.

Zurück zum ursprünglichen Problem: Du kannst mehrfache Feldinhalte nur zulassen oder unterbinden, nicht sowohl als auch. Dazu der Spruch: "Wasch mich, mach aber mein Pelz nicht nass".

Gibt 2 Möglichkeiten:

  1. du kümmerst dich selber darum dass nix doppelt eingefügt wird. D.h. du machst vor dem Insert eine Abfrage ob dein Wert schon drin ist und wenn ja, lässt du das mit dem Insert sein

  2. du lässt MySQL das übernehmen mit dem UNIQUE Key. Eine Spalte die den Unique-Key hat kann jeden Wert nur einmal einfügen und du bekommst eine Fehlermeldung wenn du es dennoch versuchst Duplikate einzufügen. Du kannst Unique auch auf Spaltenkombinationen anwenden, dann muss die Kombination der Werte einmalig sein

Unique möchte ich vermeiden, da man dann in der Tabelle Test2 nichtsmehr ändern kann.

Das stimmt nicht. MySQL lässt bloß nicht zu dass du einen Eintrag so änderst dass er dann doppelt vorkommt

In jedem Fall empfohlen ist Unique für sowas zu benutzen, denn genau dafür ist es vorgesehn! Du hast MySQL nur auf dem falschen Fuß erwischt, setze dich etwas mehr mit Unique auseinander und du wirst feststellen, dass es genau das richtige für dich ist

Wenn du unbedingt auf Unique verzichten willst, dann INSERT oder UPDATE-Statement mittels WHERE NOT EXIST-Klausel überprüfen. Zum Beispiel: INSERT INTO Test2 (id, test1, test2) values (2, 'grün', 'Gras') WHERE NOT EXISTS ( SELECT * FROM Test2 WHERE test2 = 'Gras' ); Syntax ohne Gewähr.;-)

Hello there,

Du verwechselst hier offenbar wirklich was.

Es ist sinnvoll, die Spalte Test2 dann als UNIQUE zu deklarieren, wenn sie wirklich eindeutig sein soll. Und ändern kannst du ja dennoch was, das UNIQUE verhindert ja nur, dass du einen Eintrag der schonmal da ist, nochmal rein haust.

Und das ist für PHP ganz praktisch, weil du dann genau auf dein Problem reagieren kannst. Denn wenn MySQL einen Eintrag verweigert, wegen UNIQUE dann entsteht ein Fehler, mit einer ganz bestimmten Fehlernummer (nämlich 1062), den du mit PHP abfangen kannst:

<?php
$datenbank = mysqli_connect("meinserver", "meinbenutzer", "meinpasswort", "meinedatenbank") or trigger_error("Es ist ein Fehler aufgetreten:" . mysqli_connect_error());
$sql = "INSERT INTO testtabelle (ID, test1, test2) VALUES (null, 'irgendwas', 'denwertgibtsschonmal')";
if (!$datenbank->query($sql))
{
        if ($datenbank->errno == 1062)
        {
                echo "Achtung, die Spalte test2 muss eindeutig sein. Bitte versuchen Sie einen anderen Wert";
        }
}
else
{
        echo "Eintrag erfolgreich";
}
$datenbank->close();
?>

Ist genau das was du letztlich haben willst. Oder nicht? :) Was ist dein Bedenken bei der Setzung von UNIQUE? Du könntest natürlich theoretisch auch vor jedem INSERT erstmal mit einem SELECT-Statement abfragen ob der Wert den du reinhauen willst, schon da ist, aber das doch ein grausamer Stil?:

<?php
$datenbank = mysqli_connect("meinserver", "meinbenutzer", "meinpasswort", "meinedatenbank") or trigger_error("Es ist ein Fehler aufgetreten:" . mysqli_connect_error());
$sql = "SELECT * FROM testtabelle WHERE test2 LIKE 'gibtsmichschon?';";
$result = $datenbank->query($sql);
if ($result->num_rows > 0)
{
        echo "Achtung, die Spalte test2 muss eindeutig sein. Bitte versuchen Sie einen anderen Wert";
}
else
{
        $datenbank->query("INSERT INTO testtabelle (ID, test1, test2) VALUES (null, 'irgendwas', 'gibtsmichschon?');");
}
$datenbank->close();
?>

Also ich bin der Meinung wie meine Vorredner, dass du mit UNIQUE sehr gut bedient bist.

Meld dich einfach, wenn du noch Fragen hast.

MfG

Alex

Ich verstehe deine Frage nicht so ganz. Wie wäre es mit einem Primärschlüssel?

Ist dein Tabellenaufbau:

Tabelle

Feld: ID

Feld: Test1

Feld: Test2

oder sind das Tabellen?

safur 06.09.2014, 17:43

Du möchtest bei Tabelle 2 keinen Primärschlüssel vergeben, es sollen aber keine doppelten Einträge in die Tabelle? Dann wirst du wohl vor jedem Insert bzw. Update kurz prüfen müssen, ob es diesen Eintrag schon gibt.

0
Doyli 06.09.2014, 17:50

Genau, das ist die Struktur... habe es nur so als beispiel gemacht, also

Tabelle ID Test1 Test2

Nun können Einträge gemacht werden. Trägt man per Formular nun Gras ein, was in Test2 bereits schon vorhanden ist, also "Gras" steht bereits drinnen, so soll der Eintrag fehlschlagen.

0
safur 06.09.2014, 18:00
@Doyli

Nur mal so: Welche Art von Datensätze stehen denn da grundsätzlich drin? Hat Test1 und Test2 einen Bezug?

Was würde dich an UNIQUE denn stören? Du bekommst als Rückgabe beim INSERT/UPDATE ein "FALSE" geliefert.

0

Was möchtest Du wissen?