phpbar.de logo

Mailinglisten-Archive

[php] Kopieren von Fremdschlüsseldaten einer MySQL Datenbank

[php] Kopieren von Fremdschlüsseldaten einer MySQL Datenbank

Eidner, Fabian fabian.eidner at sap.com
Mit Nov 22 14:22:27 CET 2006


Hallo Lutz,

Lutz schrieb:
>
>Hallo Fabian,
>
>ich will jetzt nichts Falsches sagen, aber nach meiner Interpretation 
>schlägt der INSERT-Befehl fehl, weil einer der referenzierten 
>Fremdschlüssel (oder beide) in der anderen Tabelle, wo er existieren 
>muß, zum Zeitpunkt des INSERT-Versuchs noch nicht vorhanden ist.
>
>
>Viele Grüße
>Lutz

Hmmm, 
Aber ich gehe doch von unten nach oben vor.
Damit meine ich, ich dupliziere erst die Spalten ohne Fremdschlüssel. Und erst nachdem diese Einträge vorhanden sind, werden die Einträge mit den Fremdschlüsselreferenzen erzeugt.

Also ich habe einen Array und über den loope ich, 0-n Einträge die ersten Einträge 0 usw. sind die Einträge ohne Fremdschlüssel am Ende kommen die einträge mit Fremdschlüsselbeziehungen.
Also sollten die Einträge auf die ich verweise doch eigentlich existiren, vorallem da ich die ID's ja auch erst dann bekommen kann, wenn die Einträge in der DB sind.

Hier der betreffende Codeteil:
for($i=0; $i<count($non_atomar); $i++)
{
	if($i%2 == 0)
		$id = $i/2;
	if($i%2 == 1)
	{
    		$id2 = $i-1;
		$key_cnt = 0;
		$query = mysql_query("DESCRIBE $non_atomar[$i]");
		while($result = mysql_fetch_array($query))
		{
			if($result[3] == "PRI")
			{
				$key_cnt++;
			}
		}
		if($key_cnt == 1)
		{
   			$query = mysql_query("SELECT * FROM $non_atomar[$i] WHERE $non_atomar[$id2]='$key_fields[$id]'");
    			while($result = mysql_fetch_array($query))
		{
			for($b=1; $b<(count($result)/2); $b++)
			{
				if($b == (count($result)/2)-1)
				$values = $values."'".$result[$b]."'";
				else
					$values = $values."'".$result[$b]."',";
			}
						       				
		}
		// Insert the new dataset with new key
		$insert_values = mysql_query("INSERT INTO $non_atomar[$i] VALUES ('',$values)");
		if(!$insert_values)
			$this->Message->drawMessage(ERROR,"Fehler beim kopieren der Daten.<br>".mysql_error());
		// Read the new key and add him to array
		$query = mysql_query("SELECT MAX($non_atomar[$id2]) AS $non_atomar[$id2] FROM $non_atomar[$i]");
		$result = mysql_fetch_array($query);
		array_push($new_keys,$result[0]);
		echo "<br>INSERT INTO $non_atomar[$i] VALUES ('',$values)";
		unset($values);
	}
	else
	{
		$query = mysql_query("SELECT * FROM $non_atomar[$i] WHERE $non_atomar[$id2]='$key_fields[$id]'");
		while($result = mysql_fetch_array($query))
		{
			for($b=$key_cnt; $b<(count($result)/2); $b++)
			{
			    	if($b == (count($result)/2)-1)
				     $values = $values."'".$result[$b]."'";
				else
				     $values = $values."'".$result[$b]."',";
			}
						       				
		}
		for($c=count($new_keys)-$key_cnt; $c<count($new_keys)-1; $c++)
		{
			$values = "'".$new_keys[$c]."',".$values;
		}
		// Insert the new dataset with new key
		$insert_values = mysql_query("INSERT INTO $non_atomar[$i] VALUES ('',$values)");
		if(!$insert_values)
			$this->Message->drawMessage(ERROR,"Fehler beim kopieren der Daten.<br>".mysql_error());
		// Read the new key and add him to array
		$query = mysql_query("SELECT MAX($non_atomar[$id2]) AS $non_atomar[$id2] FROM $non_atomar[$i]");
		$result = mysql_fetch_array($query);
		array_push($new_keys,$result[0]);
		echo "<br>INSERT INTO $non_atomar[$i] VALUES ('',$values)";
		unset($values);
	}
}

Mit der if Abfrage fange ich alle Atomaren Einträge ab, damit meine ich all die, welche keine Fremdschlüsselreferenz auf andere haben.
In der Else Anweisung werden die Fremdschlüssel Einträge erzeugt.

Sollte also doch eigentlich klappen, oder hab ich da einen Denkfehler drin ?

Ps.
Sorry für den "dreckigen" Code, aber noch habe ich nicht die Funktion die ich will, daher ist das alles noch ein wenig wüst.
Sobald ich das habe was ich will werde ich versuchen das alles noch ein wenig sauberer zu gestalten.

Aber noch bin ich eh nicht zufrieden mit meiner Lösung.
Ich kann im Moment z.B. nur Referenzen über max. 3 Tabellen abbilden. Also von Tab1 zu Tab2 zu Tab3 danach ist schluss, mehr gibt meine Logik im Moment nicht her :(

Wenn jemand noch ne andere gute und dynamischere Idee oder Lösung als meine hat, bitte her damit :)

Vielen Dank

php::bar PHP Wiki   -   Listenarchive