小编Erw*_*ter的帖子

此上下文错误中不允许使用 DEFAULT

我尝试向数据库添加索引,但不断收到错误:

PG::SyntaxError: ERROR: DEFAULT is not allowed in this context

阅读了几个小时的文档后,我似乎无法解决该问题。

我正在运行这个:

"CREATE UNIQUE INDEX index_uniq_service_models_default ON service_models(zone_id) WHERE default"
Run Code Online (Sandbox Code Playgroud)

我的桌子看起来像这样:

create_table :service_models do |t|
  t.string :name, null: false
  t.jsonb :configuration, null: false, default: "{}"
  t.boolean :default, null: false
  t.json :metadata, null: false, default: "{}"
  t.references :zone, foreign_key: true, null: false, index: { name: idx_name(:service_models, :zones) }

  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

我想要做的是让 ServiceModel 对于一个区域只有 1 个默认值。

一个区域可以有多个 ServiceModel,但只能有 1 个默认 ServiceModel。

sql postgresql reserved-words identifier partial-index

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

由于空闲事务,Spring Boot 事务回滚不会在 PostgreSQL 数据库上触发

我尝试执行事务操作并故意抛出异常,以验证回滚是否已完成,但回滚并未执行。

PostgreSQL 数据库版本为 12.1-1,基于 Docker。

这是包含注释的服务@Transactional

@Service
public class MyTestService {
    @Autowired
    private DocumentDataDao documentDataDao;

    @Transactional
    public void test() {
        DocumentData data = new DocumentData();
        data.setData(UUID.randomUUID().toString());
        documentDataDao.create(data);
        throw new IllegalArgumentException("Test rollback");
    }
}
Run Code Online (Sandbox Code Playgroud)

create函数使用 aNamedParameterJdbcTemplate插入数据:

String statement = String.format("INSERT INTO %s (%s) VALUES (%s) RETURNING %s", tableName,
                String.join(",", insertingColumns), String.join(",", values),
                String.join(",", returningColumns));
return getNamedJdbcTemplate().queryForObject(statement, parameters, getRowMapper());
Run Code Online (Sandbox Code Playgroud)

test函数是从另一个服务调用的:

@Service
public class ApplicationStartupListener {
    private Logger log = LoggerFactory.getLogger(ApplicationStartupListener.class);

    @Autowired
    private MyTestService testService; …
Run Code Online (Sandbox Code Playgroud)

java postgresql transactions spring-boot

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

INSERT ... ON CONFLICT DO UPDATE 中的列引用不明确

给定一个表:

CREATE TABLE IF NOT EXISTS test."TestCounter" 
("id" TEXT PRIMARY KEY, 
 "count" INTEGER);
Run Code Online (Sandbox Code Playgroud)

我想插入一条记录并增加计数器(如果该记录已存在)

CREATE TABLE IF NOT EXISTS test."TestCounter" 
("id" TEXT PRIMARY KEY, 
 "count" INTEGER);
Run Code Online (Sandbox Code Playgroud)

目前我收到此错误:

ERROR:  column reference "count" is ambiguous
LINE 4:  SET "count" = "count" + 1
                       ^
SQL state: 42702
Character: 107
Run Code Online (Sandbox Code Playgroud)

sql postgresql upsert

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

如果第一个查询没有返回,如何执行第二个查询?

我基本上有 2 个查询来返回数据,第一个查询速度很快,但在 5% 的情况下不起作用,第二个查询适用于所有情况,但速度慢很多

如何以始终返回结果但在第一个查询产生结果时避免运行第二个查询的方式对其进行编码?我所说的结果是指 1 行到 1000 行之间的任何内容

我当前的查询仅运行第一个查询并返回空结果集,如下所示:

SELECT CASE WHEN x.column1 IS NOT NULL THEN x.column1 ELSE y.column1 END column1,
       CASE WHEN x.column1 IS NOT NULL THEN x.column2 ELSE y.column2 END column2
FROM (SELECT column1, column2 FROM mytable WHERE < 1st SET OF complex conditions >) x
   , (SELECT column1, column2 FROM mytable WHERE < 2nd SET OF complex conditions >) y
Run Code Online (Sandbox Code Playgroud)

我所说的复杂条件是指一系列 GIS 函数,例如 st_intersects 和 st_dwithin ,它们会使这个问题变得更加复杂。当第一个查询返回某些内容时,两个查询的输出是相同的。我不能同时运行两者,否则它运行时间太长并且用户超时。

我当前的查询没有注册 x.column1 没有返回任何内容,并且由于 y 查询返回的条件集从未被考虑在内,如何解决这个问题?

编辑:同样,预期结果是当 query1 …

sql postgresql function

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

Postgres array_position(array, element) 有时是 0 索引?

Postgres 方法array_position(array, element)与 SQL 中的其他事物一样,是基于 1 的。例如:

SELECT array_position(array[4,5,6], 5)    -- returns 2
Run Code Online (Sandbox Code Playgroud)

但是,我正在执行以下查询来从 pg_catalog 检索非唯一索引及其列:

SELECT array_position(array[4,5,6], 5)    -- returns 2
Run Code Online (Sandbox Code Playgroud)

第四个选择indkey在数组中搜索列的ordinal_position,因此对于每一列,它都会获取其在索引中的位置。

有趣的是,第一列的位置为 0,所以我必须添加+ 1它以使其基于 1。

随后的CASE表达式使用完全相同的值作为检索 的第 n 个元素的索引indoption,奇怪的是,即使[]运算符也是基于 1 的,也能正常工作:

SELECT (array[4,5,6])[2]    -- returns 5
Run Code Online (Sandbox Code Playgroud)

这怎么样?

我目前使用的是 PG 9.6。

sql postgresql indexing ddl

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

将MySQL查询转换为PostgreSQL

我有这个问题:

DROP TABLE IF EXISTS tmp_table;
CREATE TEMPORARY TABLE tmp_table(id int primary key) 
IGNORE (
   SELECT user2role.userid AS userid
     FROM user2role 
    INNER JOIN users ON users.id=user2role.userid 
    INNER JOIN role ON role.roleid=user2role.roleid 
    WHERE role.parentrole like 'H1::H2::H3::H4::H5::%') 
UNION (
   SELECT groupid
     FROM groups
    WHERE groupid IN (2,3,4));
Run Code Online (Sandbox Code Playgroud)

此查询最初是用MySQL编写的,而不是使用DROP TABLE IF EXISTSIF NOT EXISTS.我改变了这一部分,但我不知道该怎么办IGNORE.

首先,正在IGNORE做什么?

我试图寻找PostgreSQL等价物,但它们似乎都涉及复杂的程序.我必须为此编写程序吗?如果我必须写一个,它会是什么样子?我可以IGNORE使用一些PHP代码来模拟吗?(SQL查询由PHP生成.)

mysql sql postgresql

0
推荐指数
1
解决办法
1053
查看次数

PostgreSQL:从文件系统加载文件而不插入表

我该怎么做?
在mysql中,我这样做:

SELECT LOAD_FILE('/path/to/file');
Run Code Online (Sandbox Code Playgroud)

那么postgres呢?不使用\copypsql命令?

mysql postgresql file-io

0
推荐指数
1
解决办法
1624
查看次数

Array_Agg的替代品:PostgreSQL

是否有PostgreSQL Array_Agg函数的替代方法,因此它不会返回格式为{x,y,z,}的值.我可以让它返回:x,y,z?

arrays postgresql aggregate-functions

0
推荐指数
1
解决办法
3205
查看次数

PL/pgSQL行数组

以下是可能的吗?
我希望有一个用PL/pgSQL编写的过程,它接受类似"行集合"的参数,我的意思是我需要传递给类似字典的结构:

伪代码:

function_name({key1:val1,key2:val2, key3:val3 [, ...] })
Run Code Online (Sandbox Code Playgroud)

arrays postgresql plpgsql

0
推荐指数
1
解决办法
4655
查看次数

ORACLE wm_concat等效于PostgreSQL

我是PostgreSQL的新手,我在将数据库从Oracle迁移到PostgreSQL 9.2时遇到了问题.我必须在我的代码中更改一些本机查询.我有一个子查询,如:

SELECT wm_concat(p.first_name || ' ' || p.last_name) 
FROM TODO_PERSON PR 
JOIN PERSON P ON (p.id == pr.person_id)
WHERE todo_id = internal_table.id
Run Code Online (Sandbox Code Playgroud)

在PostgreSQL中我找不到等效的功能或其他解决方案......

oracle postgresql aggregate-functions postgresql-9.2

0
推荐指数
1
解决办法
3344
查看次数