MySQL Insert ohne doppelte Einträge

KiVi-Wolf

Cadet 3rd Year
Registriert
Apr. 2007
Beiträge
34
Ich habe aktuell folgendes Problem, ich lese eine HTML Datei ein (Bookmarks.html vom Firefox per PHP) und erstelle SQL Anweisungen mit "Insert into". Das Problem was nun entsteht dürfte klar sein, jedesmal wenn eine Datei eingelesen wird werden auch Einträge erstellt egal ob die schon existieren oder nicht. Ich brauche nun eine möglichst Standardkonforme SQL Anweisung die genau diese Problematik ausschließt.

Die Quick&Dirty Lösung wäre vorher die Datensätze abzugleichen, was aber sehr viel Performance ziehen wird. Alternativ wäre es immernoch möglich erst nen Update zu fahren und sich dann die affected_rows geben zu lassen und auf dieser Basis dann die doppelten Elemente auszusortieren. Schöner wäre aber ein einziger SQL Anweisungsblock.

Der aktuelle Insert-String sieht so aus:
PHP:
 INSERT INTO `$table` SET link='$adress', name='$title', groupmember='$group';
 
Hey,

einfach beim "create Table" die Spalte, welche keine doppelten Einträge haben darf, auf "unique" setzen.
 
wenn das nur für deinen eigenen rechner ist dann zieht das ihn bestimmt nicht in den boden. bei meiner schlimmsten seite werden 12 sql-selects ausgeführt. glaubst du das interessiert meinen rechner auch nur im geringsten? ^^

kannst es auch anders machen:
hol dir einmal alle raus

PHP:
$linkarray=array();
$sql=SELECT * FROM $table;
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
$linkarray[]=$row['link']
}

So speicherst du alle bereits vorhandenen links in ein array. anschließend kannst du vor jedem insert mit einer schleife prüfen ob es den datensatz schon gibt.
Andere möglichkeit:

setz in der datenbank den Link oder den Namen, was eben eindeutig ist als UNIQUE. Dadurch schließt du aus das es einen datensatz mit dem gleichen link 2 mal gibt. SQL gibt dir in diesem fall eine fehlermeldung aus die du ja verstecken kannst. der insert wird aber dann definitiv nicht ausgeführt.
 
Es ist leider nicht für meinen eigenen Rechner, sondern wird auf einem Webserver betrieben.

Bezüglich des Unique das wird nicht angeboten, das Element bietet nur "Fulltext" an was mir zwar beim Suchen später hilft, nicht jedoch beim verhindern von doppelten Werten. Das Element ist übrigens vom Typ "TEXT" auch ein "Alter Table" mit "Add Unique" und einer angabe über die Schlüsselänge hilft da nicht weiter.

Ich habe nun eine neue Abfrage geschrieben, die ein "Insert Into" und "On Duplicate Key Update" verwendet aber das will nicht wie ich will.
PHP:
 INSERT INTO `$table` SET link='$adress', name='$title', groupmember='$group' 
ON DUPLICATE KEY UPDATE link='$adress', name='$title', groupmember='$group'


Ich habs nun auf VarChar, das ganze läuft im gegensatz zu Text mit Unique.
Mal schauen ob das ganze so arbeitet wie ich das haben will.


Ich hab noch nen interessanten Ansatz für nen Work around, man verwendet nen Sha1 Hashwert den man in nen VarChar schreibt und diesen auf Unique setzt. Dadurch kann man dann auch Elemente vom Typ "SmallText", "LongText" und "Text" einwandfrei auf Duplicate prüfen.

Werde wohl nun diese Variante verwenden damit ich speziel für den Titel Text bzw. SmallText nutzen kann.
 
Zuletzt bearbeitet:
Zurück
Oben