【问题标题】:Don't update if null is given in a procedure如果在过程中给出 null,则不要更新
【发布时间】:2019-05-28 20:21:57
【问题描述】:

我知道实现此目的的一种大致方法,但我想知道解决我的问题的干净且最佳的方法。我正在使用带有 ON DUPLICATE KEY UPDATE 的 INSERT INTO。有时没有给出一个值,但我仍然必须将它传递给过程的参数,否则它会失败。所以我一直在传递一个空值,但这会用空值更新字段,我会丢失数据。所以,如果一个空值被传递给它,我想“忽略”一个字段。换句话说,只是不更新​​它或获取当前值并将其传递进去。

我可以使用多个 IF 语句来检查一个值是否为空,但这个过程大约有 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 中有一种简单的方法可以实现这一点,请赐教,这将非常有帮助。谢谢。

【问题讨论】:

  • 也许COALESCE() 会缩短它?
  • @AymDev 就像使用 here 一样方便,但如果我使用 ON DUPLICATE KEY UPDATE 如何事先获取表的主键以便设置合并,但是?
  • 就像这篇文章一样,是的。 `type` = COALESCE(in_type, `type`) 不行吗?我不太习惯程序,可以尝试一下吗?
  • @AymDev 是的,谢谢。
  • 好吧,我可以自己发布它作为答案吗?

标签: mysql


【解决方案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

【讨论】:

  • 微小的补充:我不喜欢重复自己并在插入/重复键更新查询的两个部分都提到in_group & Co。所以我更喜欢使用VALUES(`group`) & Co。所以应该是... ON DUPLICATE KEY UPDATE `group` = VALUES(`group`), `type` = COALESCE(VALUES(`type`), `type`) ...
  • 谢谢 很方便+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多