проверка уникальности при вставке и обновлении эффективно

0

У меня есть 2 столбца в таблице сотрудников, каждая ценность столбцов должна быть уникальной (staff_code, staff_name)

|  staff_id   | staff_code | staff_name |
|-------------|------------|------------|
| 1           | MGT        | Management |
| 2           | IT         | IT staff   |

При вставке или обновлении элемента в таблице я должен проверить, является ли staff_code, а staff_name уникальным.

В текущей процедуре я использую 4 функции для ее проверки.

  1. Проверьте staff_code при вставке,
  2. Проверить staff_code при обновлении
  3. Проверьте имя_каталога при вставке
  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 условий. Это лучшая практика для этого? Могу ли я сделать это еще проще, чем доступ к базе данных несколько раз?

  • 1
    staff_name ли staff_name должно быть уникальным? Там будут люди, работающие в том же месте с тем же именем.
  • 1
    SELECT * FROM staff WHERE staff_type = $updated_staff_type OR staff_code = $staff_code проверяется один раз с помощью OR
Показать ещё 13 комментариев
Теги:

2 ответа

2

Уникальный индекс:

ALTER TABLE staff ADD UNIQUE INDEX code_name (staff_code,staff_name)

Всегда ловить ошибку "ОШИБКА: дублирующее значение ключа нарушает уникальное ограничение", которое происходит, когда пытались нарушить это ограничение.

1
  • При необходимости добавьте уникальные индексы
  • Выполнение вставки/обновления
  • Исключения ловушки
  • В разделе "Исключение" запустите свои функции, чтобы выяснить, какой дубликат

В принципе, пусть база данных обеспечивает уникальность и получает информацию об исключении после того, как она была выбрана. Это минимизирует вызовы в базу данных. Даже если вы завершите всю эту логику в вызове процедуры, вы все равно хотите сначала вставить/обновить и обработать исключения. Это эффективный способ сделать это, особенно если вставка/обновление преуспевает в большинстве случаев.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню