几个月前,我从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文档中的哪个被覆盖.
为了澄清,我想插入几个东西,如果它们已经存在则更新它们.
是否可以一次性从表中删除所有NOT NULL约束?
我有一个包含很多NOT NULL约束的大表,我正在寻找比单独删除它们更快的解决方案.
我正在寻找一种方法来运行查询以查找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对我的目的而言并不重要,并且根本不重要.
我有使用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) 在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
sql ×4
constraints ×1
default ×1
notnull ×1
plpgsql ×1
sql-drop ×1
sql-merge ×1
upsert ×1