Mysql - doppelten Eintrag vermeiden
Hello, habe bereits vergeblich gesucht aber nichts passendes gefunden. Und zwar geht es um mysql/php.
Als Beispiel mysql: ID I Test1 I Test2
Was muss ich in den PHP Code setzen, ohne das bei einem Eintrag in der Tabelle Test2 doppelte Einträge entstehen? Unique möchte ich vermeiden, da man dann in der Tabelle Test2 nichtsmehr ändern kann. Beziehungsweise gibt es eine möglichkeit Unique zu umgehen? Mir wäre Variante 1 allerdings am liebsten, sodass keine doppelten Einträge ohne Unique entstehen.
Vielen Dank für die Antworten.
4 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:
-
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
-
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
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
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.;-)