如果在过程中给出null则不更新

时间:2019-05-28 20:21:57

标签: mysql

我知道完成此操作的大致方法,但我想知道解决问题的最佳方法。我正在将INSERT INTO与ON DUPLICATE KEY UPDATE一起使用。有时没有给出值,但是我仍然必须将其传递给过程的参数,否则它将失败。因此,我一直在传递一个null值,但这将使用null更新该字段,并且我将丢失数据。因此,如果要传递一个空值,我想“忽略”该字段。换句话说,就是不更新它,或者获取当前值并传递给它。

我可以使用多个IF语句来检查一个值是否为null,但是此过程的长度约为20个值,这看起来很可笑和无聊。如果有更好的方法,我知道可以用其他方法完成。

为简单起见,我将只包括部分过程。

PROCEDURE `p_my_record_create`(
    IN in_group varchar(255),
    IN in_package varchar(255),
    IN in_type enum('A', 'M'),
    IN in_uid varchar(255),
    IN in_member_id int(11),
    IN in_first_name varchar(255)
)
BEGIN
    INSERT INTO myDatabase.my_record
    (`group`, `package`, `type`, `uid`, `member_id`, `first_name`)
    VALUES
    (in_group, in_package, in_type, in_uid, in_member_id, in_first_name)
    ON DUPLICATE KEY UPDATE
        `group` = in_group,
        `package` = in_package,
        `type` = in_type,  #if this is passed in as null then I would like for it to be "ignored" or if any of them are.
        `uid` = in_uid,
        `client_member_id` = in_client_member_id,
        `first_name` = in_first_name;

    SELECT
        record_id
    FROM
        myDatabase.my_record
    WHERE
        record_id = LAST_INSERT_ID();
END

如果有一种简单的方法可以在MySQL中完成此操作,请启发我,这将对您有所帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

PROCEDURE `p_my_record_create`(
    IN in_group varchar(255),
    IN in_package varchar(255),
    IN in_type enum('A', 'M'),
    IN in_uid varchar(255),
    IN in_member_id int(11),
    IN in_first_name varchar(255)
)
BEGIN
    INSERT INTO myDatabase.my_record
    (`group`, `package`, `type`, `uid`, `member_id`, `first_name`)
    VALUES
    (in_group, in_package, in_type, in_uid, in_member_id, in_first_name)
    ON DUPLICATE KEY UPDATE
        `group` = in_group,
        `package` = COALESCE(in_package, `package`),
        `type` = COALESCE(in_type, `type`),
        `uid` = in_uid,
        `client_member_id` = in_client_member_id,
        `first_name` = COALESCE(in_first_name, `first_name`);

    SELECT
        record_id
    FROM
        myDatabase.my_record
    WHERE
        record_id = LAST_INSERT_ID();
END