У меня есть 2 столбца в таблице сотрудников, каждая ценность столбцов должна быть уникальной (staff_code, staff_name)
| staff_id | staff_code | staff_name |
|-------------|------------|------------|
| 1 | MGT | Management |
| 2 | IT | IT staff |
При вставке или обновлении элемента в таблице я должен проверить, является ли staff_code, а staff_name уникальным.
В текущей процедуре я использую 4 функции для ее проверки.
Я включил упрощенный код
Функция проверки 1)
$SELECT * FROM staff WHERE staff_code = $staff_code
if num_of_rows > 0 //cannot insert, staff_type already exists
Функция проверки 2)
получить текущий тип персонала от
$current_staff_type => SELECT * FROM staff WHERE staff_id = $staff_id
if($current_staff_type == $updated_staff_type){
//don't update
return
}
SELECT * FROM staff WHERE staff_type = $updated_staff_type
if(num_of_rows > 0){
//the type you're going to update already exists
return
} else{
//update
}
if num_of_rows > 0 //cannot insert, staff_type already exists
У меня есть аналогичные функции и для других 2. Дело в том, что я должен отправлять сообщения об ошибках отдельно для 4 условий. Это лучшая практика для этого? Могу ли я сделать это еще проще, чем доступ к базе данных несколько раз?
Уникальный индекс:
ALTER TABLE staff ADD UNIQUE INDEX code_name (staff_code,staff_name)
Всегда ловить ошибку "ОШИБКА: дублирующее значение ключа нарушает уникальное ограничение", которое происходит, когда пытались нарушить это ограничение.
В принципе, пусть база данных обеспечивает уникальность и получает информацию об исключении после того, как она была выбрана. Это минимизирует вызовы в базу данных. Даже если вы завершите всю эту логику в вызове процедуры, вы все равно хотите сначала вставить/обновить и обработать исключения. Это эффективный способ сделать это, особенно если вставка/обновление преуспевает в большинстве случаев.
staff_name
лиstaff_name
должно быть уникальным? Там будут люди, работающие в том же месте с тем же именем.SELECT * FROM staff WHERE staff_type = $updated_staff_type OR staff_code = $staff_code
проверяется один раз с помощьюOR