2012-04-06 62 views
0

我試圖找到這個問題的答案,但沒有一個答案合適。如何使用PHP檢查做了SQL數據庫已經有

我有兩個數據庫,一個有15.000.000條目,我想提取必要的數據,並將其與周圍33.000條目存儲在一個更小的數據庫。兩個數據庫同時打開。或者至少他們應該是。

雖然具有很大的數據庫打開並從中提取的條目,是可以檢查該值是否已經存在於數據庫較小某個表?我只需要一些通用的方法來檢查。

在我的代碼,我第一次打開這兩個數據庫(大者oddsnavi_push,小的是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); 

然後我開始閱讀和計算oddsnavi_push數據:

$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')"; 

它一直工作到這一點。它將讀取的數據(id,one,two)插入到名爲calc的oddsnavi_baby表的適當列中。它在oddsnavi_baby完全爲空時正確執行。

不過,我需要如果一個條目(基於一定的「身份證」是否存在)不存在,只更新數據庫。

編輯:我會重組我的問題。從查詢結果(大數據庫),我得到字符串,爲每一行。例如$ string。如何打開第二個數據庫並檢查oddsnavi_baby.calc表是否在列事件中具有$ string值?

+1

很難說,不知道你的代碼,你有什麼嘗試。 – kapa 2012-04-06 17:26:52

+0

你可以創建一個presvent視圖? – dynamic 2012-04-06 17:39:19

回答

2

跳過檢查並嘗試僅使用INSERT IGNORE,假設Id是唯一密鑰。

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

+0

我會繼續這一點,並做一個完整的插入,並讓它忽略錯誤。如果必須專門爲數據庫合併創建'唯一'約束。 – philwinkle 2012-04-06 22:28:29

+0

優雅的解決方案,不會減慢速度 - 完美。謝啦。 – 2012-04-06 23:55:39

1

人,我記得來面對這樣的問題一次。我認爲我們實際上選擇了慢而昂貴的路線,並編寫了一個腳本來一次提取一個條目,並對其進行比較,如果尚未存在,則插入它。 然而,我發現這個職位,這聽起來像它可能是對你有所幫助:

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

祝你好運:)

+0

謝謝,很高興看到作爲概念證明,但對於這個5 GB數據庫的查詢非常漫長而且緩慢。另一個聯盟(我已經有四五個)會讓它變得更慢。我將不得不嘗試其他的東西。 – 2012-04-06 18:38:22

0

爲什麼你真的需要多個數據庫?金額無關緊要表格很好,不需要拆分。

//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

我不應該觸摸大數據庫,因爲它是從另一臺服務器動態推送的。否則它會很容易。 – 2012-04-06 17:41:16

+0

@DyanHoyrvat,無論哪種方式,我的答案給你的解決方案。 – Starx 2012-04-06 17:42:18

+0

如果(mysql_num_rows($ result)){不是說**是什麼** ... – 2012-04-06 18:21:34

相關問題