2010-06-26 72 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