2012-04-06 9 views
0

Ich habe versucht, die Antwort auf diese Frage zu finden, aber keine der Antworten passen.Wie mit PHP zu überprüfen, hat eine SQL-Datenbank bereits

Ich habe zwei Datenbanken, eine hat 15.000.000 Einträge und ich möchte die notwendigen Daten extrahieren und in einer viel kleineren Datenbank mit rund 33.000 Einträgen speichern. Beide Datenbanken sind gleichzeitig geöffnet. Oder zumindest sollten sie sein.

Während die große Datenbank geöffnet ist und die Einträge daraus extrahiert werden, kann überprüft werden, ob der Wert in einer bestimmten Tabelle in der kleineren Datenbank bereits existiert? Ich brauche nur einen generischen Weg, der das überprüft.

In meinem Code, den ich zunächst beide Datenbanken zu öffnen (große ist oddsnavi_push, kleine ist oddsnavi_baby):

$database = "oddsnavi_push";  
$db_handle = mysql_connect($server, $user_name, $password); 
$db_found = mysql_select_db($database, $db_handle); 
$database_baby = "oddsnavi_baby"; 
$db_handle_baby = mysql_connect($server, $user_name, $password); 
$db_found_baby = mysql_select_db($database_baby, $db_handle_baby); 

Und dann fange ich zu lesen und Daten aus oddsnavi_push zu berechnen:

$SQL_SELECT_ALL = "...giant query..."; 
$result_select_all = mysql_query($SQL_SELECT_ALL); 

while($db_field_all = mysql_fetch_assoc($result_select_all)) { 
$SQL_INSERT="INSERT INTO oddsnavi_baby.calc (id, one, two) VALUES ('$id', '$one', '$two')"; 

Es funktioniert bis zu diesem Punkt. Es nimmt die Daten, die gelesen wurden (id, eins, zwei) und fügt sie in richtige Spalten in oddsnavi_baby Tabelle namens calc ein. Es tut das richtig, wenn das oddsnavi_baby vollständig leer ist.

Allerdings muss ich nur die Datenbank aktualisieren, wenn ein Eintrag (basierend darauf, ob eine bestimmte 'ID' existiert oder nicht) nicht existiert.

EDIT: Ich werde meine Frage umformulieren. Aus den Abfrageergebnissen (große Datenbank) bekomme ich Strings für jede Zeile. Zum Beispiel $ string. Wie öffne ich die zweite Datenbank und überprüfe ob die oddsnavi_baby.calc Tabelle den $ string Wert in der Spalte Events hat?

+1

Schwer zu sagen, ohne den Code zu wissen, und was haben Sie versucht. – kapa

+0

könnten Sie eine präsente Ansicht erstellen? – dynamic

Antwort

2

den Scheck überspringen und versuchen, mit nur INSERT IGNORE die Id ist ein eindeutiger Schlüssel angenommen.

http://dev.mysql.com/doc/refman/5.5/en/insert.html

+0

Ich werde das zweitstellen und eine vollständige einfügen und lassen Sie es die Fehler ignorieren. Erstellen Sie "eindeutige" Einschränkungen speziell für die db-Zusammenführung, wenn Sie müssen. – philwinkle

+0

Elegante Lösung, verlangsamt die Dinge nicht - perfekt. Danke, Mann. –

1

Mann, ich erinnere mich, dass ich einmal auf ein solches Problem gestoßen bin. Ich denke, wir sind tatsächlich auf die langsame, teure Route gegangen und haben ein Skript geschrieben, um einen Eintrag nach dem anderen zu ziehen, ihn zu vergleichen und ihn einzufügen, wenn er nicht schon existiert. Jedoch fand ich diesen Beitrag, das klingt wie es Ihnen eine Hilfe sein könnte:

http://www.mysqlfaqs.net/mysql-faqs/Tricky-Select-Queries/How-to-compare-data-of-two-tables-of-two-different-databases-in-MySQL

Viel Glück :)

+0

Danke, schön als Beweis für das Konzept zu sehen, aber die Abfrage für diese 5 GB-Datenbank ist sehr lang und langsam. Eine andere UNION (ich habe schon vier oder fünf) würde es noch langsamer machen. Ich muss etwas anderes versuchen. –

0

Warum brauchen Sie wirklich mehrere Datenbank? Betrag ist nicht wichtig, Tabellen sind in Ordnung, keine Notwendigkeit zu teilen.

//Multiple links to different databases 
$dblink1 = mysqli_connect($localhost, $user, $pass, $db1); 
$dblink2 = mysqli_connect($localhost, $user, $pass, $db2); 


$id = '1'; // Id to check 
$query = "SELECT COUNT(*) FROM `table` WHERE id = '1' LIMIT 1"; 
$result = mysqli_query($dblink1, $query); //query db 1 

if(mysql_num_rows($result)) { 
    $query = "INSERT INTO `table` VALUES(.....)"; 
    $result = mysqli_query($dblink1, $query); //query db 2 
} 
+0

Ich sollte nicht die große Datenbank berühren, da sie dynamisch von einem anderen Server geschoben wird. Sonst wäre es ziemlich einfach. –

+0

@DyanHoyrvat, Wie auch immer, meine Antwort gibt Ihnen die Lösung. – Starx

+0

if (mysql_num_rows ($ result)) {sagt nicht, ob ** was ** ... –

Verwandte Themen