【发布时间】: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