关于mysql:如果值为空,则将默认值插入非空列

Insert default into not null column if value is null

我有一个表 foo,它有一个 NOT NULL 列,默认名为 message:

1
2
3
4
CREATE TABLE foo(
    id int PRIMARY KEY,
    message varchar(64) NOT NULL DEFAULT 'Hello'
)

有一个存储过程 bar 插入到 foo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE PROCEDURE bar(
    i_id int,
    i_message varchar(64)
)
BEGIN

    -- other logic

    IF i_message IS NOT NULL THEN
        INSERT INTO foo (id, message) VALUES (i_id, i_message);
    ELSE
        INSERT INTO foo (id, message) VALUES (i_id, DEFAULT);
        -- could also be: INSERT INTO foo (id) VALUES (i_id);
    END IF;
 END;

你可以看到,如果 i_message 为空,我必须有条件地分支以便我的插入使用默认值。这对于一列来说很好,但考虑如果 foo 有更多的 NOT NULL DEFAULT 列 - 语法将是笨拙的方式。

我是否可以使用一种语法来指定插入的值如果为 null 则应回退到默认值?我尝试了以下但可以理解的语法错误:

1
2
INSERT INTO foo (id, message) VALUES (i_id, COALESCE(i_message, DEFAULT));
INSERT INTO foo (id, message) VALUES (i_id, IFNULL(i_message, DEFAULT));


1
2
3
  INSERT INTO foo (id, message)
  VALUES
  (i_id, IFNULL(i_message,DEFAULT(message)));