2010-06-26 3 views
2

Я пытаюсь вставить строку в таблицу MySQL с условием, что сама строка должна быть уникальной. Так, например, строка имела бы id, name и address, но мы не можем иметь вставку с двойным именем и адресом. Я попытался сделать выбор перед вставкой, чтобы убедиться, что я не нахожу результат, но он, похоже, не работает. В настоящее время я пытаюсь сделать это перед установкой:Как обеспечить, чтобы строки MySQL были уникальными?

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

EDIT: Все эти поля могут дублировать, они просто не могут дублировать все в то же время.

ответ

3

Чистым решением было бы установить ограничение UNIQUE на cityId, countyId, stateId, countryId, districtId, а затем проверить, был ли оператор вставки успешным.

Чтобы быстро проверить это:

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

и повторите запрос вставки. Если он встретит дубликат, он не удастся, с которым вы сможете обращаться в своем приложении.

+0

Эти идентификаторы могут быть дублирующими, они просто не могут дублироваться вместе. – chustar

+2

@chustar: предложение Дениса удовлетворяет этому требованию. – Hammerite

1

Предполагая, что у вас уже есть уникальный индекс, установленный на столе вы можете использовать:

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

с такими ограничениями, вы должны были сделать имя и адрес столбца в качестве составного первичного ключа ..

+1

Arguable. По крайней мере, на столбцах должен быть уникальный индекс. – Hammerite

0

I Думаю, у меня есть лучшее решение. Сначала проверьте базу данных и проверьте, существует ли 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

Смежные вопросы