2010-06-26 59 views
2

我想插入一行到MySQL表中,條件是行本身必須是唯一的。 因此,例如,該行將具有id,nameaddress,但我們不能有具有重複名稱和地址的插入。 我試圖在插入之前做一個選擇,以確保我沒有找到結果,但它似乎沒有工作。 目前我正在試圖插入之前做到這一點:如何確保MySQL行是唯一的?

SELECT * FROM locations WHERE cityId = $cityId AND countyId = $countyId AND stateId = $stateId AND countryId = $countyId AND district = $district; 

編輯: 所有這些領域都允許複製,他們不能在同一時間複製所有。

回答

3

最簡潔的解決方案是在cityId,countyId,stateId,countryId,districtId上設置UNIQUE約束,然後檢查insert語句是否成功。

要快速測試:

ALTER TABLE your_table_here ADD UNIQUE INDEX(cityId, stateId, countryId, countyId, districtId); 

,然後重新運行插入查詢。如果遇到重複,則會失敗,您可以在應用程序中處理這些錯誤。

+0

這些ID可以重複,它們只是不能重複在一起。 – chustar 2010-06-26 17:30:23

+2

@chustar:丹尼斯的建議可以滿足這個要求。 – Hammerite 2010-06-26 17:32:08

1

假設你已經在桌子上設置一個唯一索引,你可以使用:

INSERT IGNORE INTO locations SET cityId = $cityId, countyId = $countyId, stateId = $stateId, countryId = $countyId, district = $district; 
0

有這樣的限制,你應該讓我們的名稱和地址列作爲複合主鍵..

+1

可爭辯。至少在列上應該有一個唯一索引。 – Hammerite 2010-06-26 17:37:56

0

我認爲我有更好的解決方案。首先檢查數據庫,並檢查IP和名稱是否存在使用:

$check = mysqli_num_rows(mysqli_query($conn, 'SELECT FROM tablename WHERE name="'.$_POST['name'].'"')); 
if($check = 0) //Checks if the name does not exist 
{ 
     // Your code... 
} 
else 
{ 
     // Error to tell the user the name already exists.... 
} 
+0

你能解釋一下爲什麼你認爲這是一個更好的解決方案嗎?使用現有的答案需要一個單一的查詢,而您的代碼需要兩個查詢。所以原來的效率更高,但是您認爲您的解決方案更好還有其他原因嗎? – andrewsi 2015-11-03 21:57:50