当前位置: 首页 > 面试题库 >

插入一个COALESCE(NULL,默认)

赵星华
2023-03-14
问题内容

我有使用UUID的表。我希望能够插入有或没有UUID的新行,因为有时客户端有时会生成UUID。

每个表的核心是这样的:

CREATE TABLE IF NOT EXISTS person (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid()
);

我正在尝试使用一个函数来插入行。我希望能够提供一个NULL ID并获取默认值(生成的UUID)。我有这样的事情:

CREATE OR REPLACE FUNCTION create_person(
    id UUID
) RETURNS BOOLEAN LANGUAGE plpgsql SECURITY DEFINER AS $$
BEGIN
    INSERT INTO person( id )
    VALUES (
        COALESCE(id,default)
    );
    RETURN FOUND;
END;
$$;

我已经试过了:

INSERT INTO person ( id ) VALUES (
    COALESCE(id, default),
);

还有这个:

INSERT INTO person ( id ) VALUES (
  CASE WHEN id IS NULL THEN default ELSE id END
);

这有效,但是重复了gen_random_uuid()代码:

INSERT INTO person ( id ) VALUES (
  COALESCE(id, gen_random_uuid()),
);

同样也可以,但是存在相同的问题:

INSERT INTO person ( id ) VALUES (
    CASE WHEN id IS NULL THEN gen_random_uuid() ELSE id END
);

有没有一种方法可以不必重复执行gen_random_uuid()代码?

这样做会更好plpgsql吗?


问题答案:

无法在列上重复使用定义的默认值。默认值仅用于定义INSERT未指定值时会发生的情况。根据此定义null值仍然是“指定的”,因此不能使用默认值。

您关于某人可能不使用该功能的评论表明,触发器比简单的功能更适合您的要求。

https://www.postgresql.org/docs/current/static/plpgsql-
trigger.html

CREATE OR REPLACE FUNCTION default_id() RETURNS TRIGGER AS $default_id$
    BEGIN       
        IF (NEW.id IS NULL) THEN
            NEW.id := gen_random_uuid();
        END IF;
        RETURN NEW;
    END;
$default_id$ LANGUAGE plpgsql;

CREATE TRIGGER default_id_trigger
BEFORE INSERT OR UPDATE ON person
    FOR EACH ROW EXECUTE PROCEDURE default_id();

如果您确实想使用函数来执行此操作,那么最简单的方法就是在插入之前分配值:

CREATE OR REPLACE FUNCTION create_person(
    id UUID
) RETURNS BOOLEAN LANGUAGE plpgsql SECURITY DEFINER AS $$
BEGIN
    IF id IS NULL THEN
        id := gen_random_uuid();
    END IF;
    -- OR
    -- id := coalesce(id, gen_random_uuid());
    INSERT INTO person( id )
    VALUES (id);
    RETURN FOUND;
END;
$$;


 类似资料:
  • 我在MySQL数据库中有一个表,其中包含一个默认值的列,在数据库端使用phpMyAdmin定义。当我使用HiberNate插入新行时,我得到这个错误: 通用域名格式。mysql。jdbc。例外。jdbc4。MySQLIntegrityConstraintViolationException:列“status”不能为null 我还需要做些什么来使用默认值吗? 实体

  • 问题内容: 我正在尝试使用多个插入(在一条语句中),并且我具有此表结构 我的查询: 由于[StudentID]列不接受NULL,因此该语句(我预期是)应该失败。问题是MySQL在第2行中插入了空字符串(’‘)…,并允许其余的继续。 问题答案: 问题: 或放 下到(然后重新启动)。

  • 问题内容: 我正在尝试像这样从C#向我的数据库中插入一个空值: DBNull.Value是日期可以在的地方,但我希望它等于null,但它似乎将默认日期设置为1900 … 问题答案: 改成: 返回空字符串,但您希望改为null。 但是,这种构建查询的方式可能会导致问题。例如,如果您的字符串之一包含引号’,则结果查询将引发错误。更好的方法是使用参数并在SqlCommand对象上进行设置:

  • 问题内容: 这是场景: 我正在尝试在插入表时创建引用记录。但是我得到的是null,因为它是自动从序列中生成的。我也尝试了触发器插入,但是结果是一样的。有什么办法解决吗? 问题答案: 避免使用规则,因为它们会再次咬住您。 在每行运行的表a上使用after触发器。它看起来应该像这样(未经测试):

  • 我尝试从本地磁盘(Windows 10)向我的RDS MySQL数据库插入一个blob。然而,我的查询没有插入blob。新行包含所有其他列,但blob为空。 以下是我尝试过的: 我设置了文件的读/写权限 安全文件设置为/tmp。。。我不知道这是什么意思。这是路径还是变量?如果它是一个变量,我已经尝试从用户/系统变量“TMP”的路径上传blob,但没有成功。我无法更改安全文件,因为RDS允许更改。。

  • 我添加了一个foreignKey列来指定用户的角色。这是users表:在我将nullable()添加到role_id列之前,他们被告知role_id列没有默认值,当我添加nullable()时,他们将NULL值插入表中 这是角色表: 这是角色列的刀片代码:我在刀片代码中添加了一个数组,以在选项标记中显示其内容,属性名称为“role_id” 这是“CreateNewUser.php”文件的创建方法: