Когда я пытаюсь обновить запись, я получаю сообщение об ошибке # 1062 - Дублирующая запись для ключа 'ID_UNIQUE' - PullRequest
0 голосов
/ 23 ноября 2018

Я использую следующую хранимую процедуру для обновления таблицы:

DELIMITER $$
CREATE DEFINER=`developer`@`localhost` PROCEDURE `update_patient`(IN `patient_id` INT(11), IN `name` VARCHAR(45), IN `surname` VARCHAR(45), IN `middle_name` VARCHAR(45), IN `email` VARCHAR(45), IN `phone` VARCHAR(45), IN `mobile` VARCHAR(45), IN `address_id` INT(11), IN `address_no` VARCHAR(8), IN `ID` VARCHAR(45), IN `DOB` DATE)
    NO SQL
UPDATE
  patient
SET name  = name,
  surname = surname,
  middle_name = middle_name,
  email = email,
  phone = phone,
  mobile = mobile,
  address_id = address_id,
  address_no = address_no,
  ID = ID,
  DOB = DOB      
WHERE
  patient_id = patient_id
LIMIT 1;
END$$
DELIMITER ;

Когда я пытаюсь вызвать ее через phpmyadmin Я получаю ошибку: #1062 - Duplicate entry '844844' for key 'ID_UNIQUE'

844844 относится к полю ID.У меня есть это поле в таблице patient, и я хочу обновить данные пациента.Однако первичный ключ таблицы пациента - patiend_id, а не ID.

Знаете ли вы, как исправить ошибку?

1 Ответ

0 голосов
/ 23 ноября 2018

Проблема в том, что ваши входные параметры для хранимой процедуры совпадают с именами столбцов в таблице.Это приводит к неоднозначному поведению.

Например: In SET name = name;Как MySQL решает, какое из этих значений является значением параметра, а какое - именем столбца?

Обычно я ставлю префикс IN с in_ и OUT с out_ для удобства чтения кода и избеганиянеоднозначное поведение.

DELIMITER $$
CREATE definer=`developer`@`localhost`
PROCEDURE `update_patient`(IN `in_patient_id`  INT(11),
                           IN `in_name`        VARCHAR(45),
                           IN `in_surname`     VARCHAR(45),
                           IN `in_middle_name` VARCHAR(45),
                           IN `in_email`       VARCHAR(45),
                           IN `in_phone`       VARCHAR(45),
                           IN `in_mobile`      VARCHAR(45),
                           IN `in_address_id`  INT(11),
                           IN `in_address_no`  VARCHAR(8),
                           IN `in_id`          VARCHAR(45),
                           IN `in_dob`         date)
  NO SQL

  UPDATE patient
  SET    name = in_name,
         surname = in_surname,
         middle_name = in_middle_name,
         email = in_email,
         phone = in_phone,
         mobile = in_mobile,
         address_id = in_address_id,
         address_no = in_address_no,
         id = in_id,
         dob = in_dob
  WHERE  patient_id = in_patient_id
  LIMIT  1;

END$$
DELIMITER ;
...