keine doppelten Datensätze eintragen

NullAhnung

Aktives Mitglied
View_1
CODE CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `db`.`View_1` AS
SELECT `match_qid`, `match_fid`, `tabelle1`.`language_ID`
FROM `tabelle2`
LEFT JOIN `tabelle1` ON `tabelle1`.`to_fid` = `tabelle2`.`match_fid`
ORDER BY `match_qid`

das steht in dieser View drin:

QUOTE match_qid  match_fid  language_ID
49                8                 1
49               41                1
53               41                1
53              115               1
53              115               2



in der tabelle1 stehen diese Daten drin...


QUOTE to_fid  language_ID
8                1
41               1
115             1
115             2




so nun möchte ich in die tabelle1 neue datensätze hinzufügen, die identisch sind nur eine neue language_ID bekommen
nehmen wir an.. $_SESSION['qid'] = 53 und $_SESSION['defaultLanguage']=1
also hol ich die entsprechenden Datensätze raus aus View_1 ändere die language_ID in $lid ($lid=2) und schreibe diese wieder rein...

CODE <?
$query = "SELECT match_qid, match_fid, language_ID
FROM View_1
WHERE match_qid = '".$_SESSION['qid']."' AND language_ID = '".$_SESSION['language_ID']."'      
   ";    
$ergebnis = mysql_query($query)OR die("Error: $query <br>".mysql_error());
while($row = mysql_fetch_object($ergebnis))  
{
 $row->language_ID=$lid;

 mysql_select_db('db');
 $into = "INSERT INTO tabelle1
 SET to_fid = '".$row->match_fid."',  
 language_ID = '".$lid."'
 ";  
 $res = mysql_query($into)OR die("Error: $into <br>".mysql_error());
}
?>


wenn ich das mache, dann habe ich folgenden Inhalt in View_1

QUOTE match_qid  match_fid  language_ID
49                8                 1
49               41                1
53               41                1
53              115               1
53              115               2
53              115               2
53               41                2




nur leider ist ein doppelter 53 115 2 drin... und ich weiß nicht wie ich es machen kann, dass vorher abgeprüft wird, ob so ein datensatz schon da ist...
in diesem fall dürfte nur 41 und 2 eingetragen werden
 
UNIQUE Index auf die Datenbank setzen für die 3 Felder und die Datenbank meldet einen Fehler zurück, wenn man einen doppelten Einfügen möchte, alternativ vor dem Einfügen nachschauen, ob so ein Datensatz bereits existiert...

Wobei Variante 1 keine Anfälligkeit gegenüber Race Conditions hat, Variante 2 schon.
 
danke für die antwort.... das mit der variante2 hab ich auch schon versucht, also eine 2 while-schleife oder mit IF einbauen...

etwa so
CODE <?
$query = "SELECT match_qid, match_fid, language_ID
FROM View_1
WHERE match_qid = '".$_SESSION['qid']."' AND language_ID = '".$_SESSION['language_ID']."'      
   ";    
$ergebnis = mysql_query($query)OR die("Error: $query <br>".mysql_error());
while($row = mysql_fetch_object($ergebnis))  
{
 $sql = "SELECT count(language_ID) AS anzahl,
 match_fid
 FROM View_1
 WHERE language_ID ='".$lid."'
 AND match_qid = '".$_SESSION['qid']."'
 Group By match_fid
 ";
 $res = mysql_query($sql)OR die("Error: $sql <br>".mysql_error());
 $vorhanden = mysql_fetch_object($res);
 IF (!ISSET ($vorhanden->anzahl)){$vorhanden->anzahl=0;}
 echo $vorhanden->anzahl."<br/>";  // für testzwecke
 IF ($vorhanden->anzahl == 0)
  {
  echo "Anzahl".$vorhanden->anzahl."<br/>"; // für testzwecke
  echo $row->match_qid.$row->match_fid.$row->language_ID."<br/>"; // für testzwecke
  $row->language_ID=$lid;
  echo $row->match_qid.$row->match_fid.$row->language_ID."<br/>"; // für testzwecke
 
  mysql_select_db('db');
  $into = "INSERT INTO tabelle1
  SET to_fid = '".$row->match_fid."',  
  language_ID = '".$lid."'
  ";  
  $res = mysql_query($into)OR die("Error: $into <br>".mysql_error());
  }
}
?>


Ist kein datensatz in View_1 mit language_ID=2 dann zeigt die Bildschirmausgabe folgendes an:
0
Anzahl0
53411
53412
1

und der Datensatz wird mit 41 und 2 geschrieben.... der datensatz mit 115 und 2 nicht....

lasse ich nochmals das script laufen dann ist echo:
1
1

obwohl der 115 mit 2 nicht drin steht...diese anzeige wäre richtig, wenn beim erstenmal die 115 mit 2 auch eingetragen worden wäre....
... bin total am verzweifeln.... an dem Problem hänge ich schon seit tagen rum...
 
ich verwende INSERT IGNORE - es wird kein doppelter Schlüssel eingefügt und keine Fehrlermeldung generiert.
 
Zurück
Oben