相关疑难解决方法(0)

在PostgreSQL中重复更新时插入?

几个月前,我从Stack Overflow的答案中学到了如何使用以下语法在MySQL中一次执行多个更新:

INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z)
ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2);
Run Code Online (Sandbox Code Playgroud)

我现在切换到PostgreSQL,显然这是不正确的.它指的是所有正确的表,所以我认为这是使用不同关键字的问题,但我不确定PostgreSQL文档中的哪个被覆盖.

为了澄清,我想插入几个东西,如果它们已经存在则更新它们.

sql postgresql upsert sql-merge

611
推荐指数
15
解决办法
40万
查看次数

如何一次性从PostgreSQL表中删除所有NOT NULL约束

是否可以一次性从表中删除所有NOT NULL约束?

我有一个包含很多NOT NULL约束的大表,我正在寻找比单独删除它们更快的解决方案.

sql postgresql constraints notnull sql-drop

48
推荐指数
4
解决办法
5万
查看次数

获取Postgres中表列的默认值?

我正在寻找一种方法来运行查询以查找Postgres中表的列的默认值.例如,如果我使用以下查询创建了一个表:

**编者注:我修改了表定义,因为它对问题没有影响.

CREATE TABLE mytable (
    integer int DEFAULT 2,
    text varchar(64) DEFAULT 'I am default',
    moretext varchar(64) DEFAULT 'I am also default',
    unimportant int 
);
Run Code Online (Sandbox Code Playgroud)

我需要一个查询,告诉我,在某种格式中,默认值integer是2,text是'我是默认',并且moretext'我也是默认'.查询结果可以包含任何其他没有默认值的列的任何值,即,unimportant对我的目的而言并不重要,并且根本不重要.

sql postgresql default

22
推荐指数
3
解决办法
2万
查看次数

插入COALESCE(NULL,默认值)

我有使用UUID的表.我希望能够在有或没有UUID的情况下插入新行,因为有时客户端会生成UUID,有时则不会.

每个表都有它的核心:

CREATE TABLE IF NOT EXISTS person (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid()
);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用函数来插入行.我希望能够传递一个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;
$$;
Run Code Online (Sandbox Code Playgroud)

我试过这个:

INSERT INTO person ( id ) VALUES (
    COALESCE(id, default),
);
Run Code Online (Sandbox Code Playgroud)

还有这个:

INSERT INTO person ( id ) VALUES (
  CASE WHEN id IS NULL THEN default ELSE id END
); …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

8
推荐指数
2
解决办法
4872
查看次数

PostgreSQL,选择一个“假”行

在Postgres 8.4或更高版本中,最有效的方法是在不实际创建row的情况下默认情况下获取一行数据。例如,作为交易(伪代码):

create table "mytable"
(
  id serial PRIMARY KEY NOT NULL,
  parent_id integer NOT NULL DEFAULT 1,
  random_id integer NOT NULL DEFAULT random(),
)

begin transaction
  fake_row = insert into mytable (id) values (0) returning *;
  delete from mytable where id=0;
  return fake_row;
end transaction
Run Code Online (Sandbox Code Playgroud)

基本上,我希望查询的单行中parent_id为1且random_id为随机数(或其他函数返回值),但我不希望该记录保留在表中或影响主键序列serial_id_seq。

我的选择似乎是使用如上所述的事务或创建视图,这些视图是添加了假行的表的副本,但我不知道每个视图的利弊或是否存在更好的方法。

我正在寻找一个答案,该答案假定除列id的数量或顺序外,不假定任何列的数据类型或默认值具有先验知识。只有表名是已知的,并且表中不应存在ID为0的记录。

过去,我将伪记录0创建为永久记录,但是我开始考虑将此记录视为一种污染(因为我通常必须将其从将来的查询中过滤掉)。

postgresql

5
推荐指数
1
解决办法
2417
查看次数