2013-05-31 43 views
0

我有一個表格,用戶應該輸入數據(名稱,街道名,街道號),然後我想檢查表中是否存在該數據(名稱,街道名+街道號)所以我可以使用該行而不是製作一個新的。 有沒有一種簡單的方法來做到這一點,或者我將不得不將數據提取到數組中並以某種方式進行搜索?查找傳入的數據是否存在於sql表中

我有這樣的代碼:

$sql = "INSERT INTO 725G54_proj_address VALUES   (NULL,'$streetname','$streetnumber')"; 
$result1 = mysql_query($sql,$con); 
$address=mysql_insert_id(); 
echo "ID of last inserted record is: " . $address; 
echo "<br>"; 


$sql = "INSERT INTO 725G54_proj_contact VALUES ('Null','$name','$telephonenumber')"; 
$result2 = mysql_query($sql,$con); 
$contact = mysql_insert_id(); 
echo "ID of last inserted record is: " . $contact; 


$sql = "INSERT INTO 725G54_proj_LivesAt VALUES ('$contact','$address')"; 
$result3 = mysql_query($sql,$con);`enter code here` 

什麼,我想是是找出是否例如主街31 proj_address媒體鏈接存在,如果這樣做,利用其自動遞增的ID爲插入到proj_Lives_at。

編輯: 我決定發送查詢來檢查數據是否存在。 我加載到一個變量,並檢查它是否爲空,但有一些問題,以便「如果(空)」不工作,因爲它應該。另一種方式(「if(!empty)」)可以工作。

查詢和加載看起來像這樣:

$sql2="SELECT 725G54_proj_address.Address_ID, GROUP_CONCAT(cast(concat(725G54_proj_address.Street_Name, ' ', 725G54_proj_address.Street_Number) AS char) SEPARATOR ', ') AS addresses 
    FROM 725G54_proj_address 
    WHERE 725G54_proj_address.Street_Name = '$streetname' AND 725G54_proj_address.Street_Number= '$streetnumber' 
    GROUP BY 725G54_proj_address.Address_ID 
    ORDER BY 725G54_proj_address.Address_ID ASC"; 
$result2=mysql_query($sql2); 

編輯2: 我曾嘗試切換到使用count(),而不是空的(),它作爲發現即使當填充它不應該變。

+0

您將不得不讀取該行,如果該行不存在,則將輸入數據插入表中。 – suspectus

+0

您必須獲取數據並進行比較。你還有什麼比較? – user1

+0

@ user1我的意思是說,在sql中有一些方法可以做到這一點,或者如果我不得不把它拿到php並做到這一點。 –

回答

0

聽起來您正在創建多對一的關係(可能),因此應該將這些數據存儲在單獨的查找表中。我在這種情況下建議首先嚐試使用「INSERT IGNORE」語句 (http://dev.mysql.com/doc/refman/5.5/en/insert.html)插入該行,然後使用mysql_affected_rows()查看是否進行了更改。如果沒有,那麼你知道有一個重複的行,你可以選擇,取得ID,然後你就完成了。

正如有人在上面的評論中提到的那樣,您可以將其變爲存儲過程。

+0

對我來說這似乎相當倒退 - 爲什麼在使用'INSERT IGNORE'後,如果在失敗時跟隨SELECT,而不是使用'SELECT'打開並根據結果決定是否使用INSERT?特別是考慮到'INSERT IGNORE'就像任何'INSERT'一樣,可能由於許多與獨特密鑰約束無關的原因而失敗,似乎這樣做爲微妙和難以壓縮的bug提供了令人不舒服的廣泛範圍,其中'SELECT'-then-INSERT'方法避免了。 –

+0

我想我正在使用你可能潛在的邏輯(並且在大多數情況下)避免做兩個查詢。不是一個選擇是一個大問題。你可能就在那裏,因爲當談到SQL時,我確實沒有任何類型的大師......但是這種技術在過去對我來說很有用。 – dudewad

+0

在我們的應用程序中,我們使用存儲過程來做類似於'IF NOT EXISTS(SELECT *)INSERT INTO'的事情。我想在技術上它仍然是第二次調用,但就代碼而言,它只是一個。或者你可以包裝它try..catch,如果有錯誤,那麼它已經存在... – ahwm

0

假設你已經在你的表上創建了正確的密鑰(即(姓名,街道名,街道號)或類似的唯一密鑰),那麼MySQL INSERT...ON DUPLICATE KEY UPDATE或可能的REPLACE INTO在這裏可能會很有用。如果要插入的密鑰已經存在於表格中,則前者會將您的INSERT聲明轉換爲UPDATE,後者將作爲常規INSERT除非密鑰已經存在,在這種情況下,它將首先在之前存在的行DELETE新數據。

當然,這不完全是一個沉重的負擔只是SELECT COUNT(*) AS n_existing FROM table WHERE...,然後在結果集中看行是否已經與您準備INSERT相同的密鑰存在檢查n_existing,有是一個爭論從principle of least astonishment開始,在INSERT之前比SELECT更好,而不是使用任何其他將要維護您的代碼的人遇到的深奧的SQL語句。儘管如此,如果您願意,也可以選擇。

相關問題