我知道完成此操作的大致方法,但我想知道解决问题的最佳方法。我正在将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中完成此操作,请启发我,这将对您有所帮助。谢谢。
答案 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