【问题标题】:When I'm trying to update a record I get error #1062 - Duplicate entry for key 'ID_UNIQUE'当我尝试更新记录时,我收到错误 #1062 - 键“ID_UNIQUE”的重复条目
【发布时间】:2019-04-26 03:37:00
【问题描述】:

我正在使用以下存储过程来更新表:

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

你知道如何解决这个错误吗?

【问题讨论】:

    标签: mysql stored-procedures phpmyadmin


    【解决方案1】:

    问题是存储过程的输入参数与表中的列名相同。这会导致模棱两可的行为。

    例如:在 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 ;
    

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 2018-05-01
      • 2014-02-02
      • 1970-01-01
      • 2013-07-23
      • 2021-12-18
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多