小编Cmd*_*ozy的帖子

PostgreSQL嵌套INSERTs/WITHs用于外键插入

我正在使用PostgreSQL 9.3,我正在尝试编写一个SQL脚本来为单元测试插入一些数据,而且我遇到了一些问题.

假设我们有三个表,结构如下:

------- Table A -------    -------- Table B --------    -------- Table C --------
id  | serial NOT NULL      id   | serial NOT NULL       id   | serial NOT NULL
foo | character varying    a_id | integer NOT NULL      b_id | integer NOT NULL
                           bar  | character varying     baz  | character varying
Run Code Online (Sandbox Code Playgroud)

B.a_idC.b_id外键的id表列AB分别.

我正在尝试做的是使用纯SQL在这三个表中的每一个表中插入一行,而不将ID硬编码到SQL中(在运行此脚本之前对数据库进行假设似乎是不合需要的,因为如果这些假设改变我将不得不返回并重新计算所有测试数据的正确ID.

请注意,我确实意识到我可以以编程方式执行此操作,但通常编写纯SQL比编写执行SQL的程序代码更简洁,因此对测试套件数据更有意义.

无论如何,这是我写的查询,我认为它可以工作:

WITH X AS (
    WITH Y AS (
        INSERT INTO A (foo)
        VALUES ('abc') …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql

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

快速嵌入数据库

我正在开发一个应用程序,它需要存储与音乐文件(艺术家,标题,播放计数等)相关的元数据,以及整数集(特别是SHA-1哈希).

我选择的解决方案需要:

  • 提供"快速"存储和检索(当查看可能数千首歌曲的列表时,我需要能够或多或少地以交互方式检索元数据).
  • 跨平台(Linux,Windows和OSX).
  • 提供我可以从C++交互的界面.
  • 是开源的(或者至少是啤酒中的自由).
  • 提供快速设置操作(并集,交集,差异) - 如果解决方案不提供此功能,但它允许我存储二进制数据,我可以使用"快速设置操作使用Treaps"等技术自行实现.
  • 被"嵌入" - 也就是说,在没有我必须进行fork另一个过程的情况下运行,或者至少提供一个简单的界面(如libmysqld).

我考虑的解决方案包括:

  • 平面文件.这非常简单,但除了平面数据存储之外不提供任何功能.
  • SQlite的.这似乎是一个非常受欢迎的选项,但它似乎在性能和并发性方面存在一些问题(有关示例问题,请参阅KDE的Akonadi).
  • 嵌入式MySQL/MariaDB.这似乎是一个合理的选择,但考虑到我不需要很多复杂的SQL功能,它也可能有点重量级.

我认为完美的假设解决方案就像Redis,但它将数据保存到磁盘,并且只将一部分数据存储在内存中以便快速检索.Redis本身可能不是一个好选择因为1)我需要fork手动操作,2)它的Windows端口看起来不那么坚固,3)将所有数据存储在RAM中将不太理想.

对于这类问题是否有其他解决方案,或者我已经列出的解决方案之一远远优于其他解决方案?

c++ database embedded-database data-structures

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

使用PostgreSQL中的EXCLUDE防止相邻/重叠的条目

我正在创建一个在PostgreSQL 9.2.4中存储任意日期/时间范围的数据库.我想在这个数据库上设置一个约束,它强制日期/时间范围不重叠,不相邻(因为两个相邻的范围可以表示为单个连续范围).

为此,我使用EXCLUDE带有GiST索引的约束.这是我目前的约束:

ADD CONSTRAINT overlap_exclude EXCLUDE USING GIST (
    box(
        point (
            extract(EPOCH FROM "from") - 1,
            extract(EPOCH FROM "from") - 1
        ),
        point (
            extract(EPOCH FROM "to"),
            extract(EPOCH FROM "to")
        )
    ) WITH &&
);
Run Code Online (Sandbox Code Playgroud)

fromto都是TIMESTAMP WITHOUT TIME ZONE,并且是以UTC格式存储的日期/时间(在我的应用程序中将数据插入这些列之前,我转换为UTC,并且我在postgresql.conf中将我的数据库的时区设置为"UTC").

但是,我想我可能遇到的问题是,这个约束正在做出(错误的)假设,即没有小于一秒的时间增量.

值得注意的是,对于我存储的特定数据,我只需要第二个分辨率.不过,我觉得我可能还是需要处理这个,因为SQL类型timestamptimestamptz都超过一秒更高的分辨率.

我的问题是:是否有任何问题,只是假设第二个解决方案,因为这是我的所有应用程序需要(或想要),或者,如果有,我怎么能改变这个约束来处理一个秒的分数健壮的方式?

sql postgresql datetime range-types exclusion-constraint

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

PostgreSQL将时间范围分成几天

我正在尝试使用PostgreSQL 9.2.4编写一个复杂的查询,但我无法正常工作.我有一个包含时间范围的表,以及其他几个列.当我在此表中存储数据时,如果所有列都相同且时间范围重叠或相邻,我将它们组合成一行.

但是当我检索它们时,我想在天边界处分割范围 - 例如:

2013-01-01 00:00:00 to 2013-01-02 23:59:59
Run Code Online (Sandbox Code Playgroud)

将被选为两行:

2013-01-01 00:00:00 to 2013-01-01 23:59:59
2013-01-02 00:00:00 to 2013-01-02 23:59:59
Run Code Online (Sandbox Code Playgroud)

对于两个检索到的条目,其他列中的值相同.

我已经看到这个问题似乎或多或少地解决了我想要的问题,但它适用于PostgreSQL的"非常旧"版本,所以我不确定它是否仍然适用.

我也看到了这个问题,它完全符合我的要求,但据我所知,该CONNECT BY语句是SQL标准的Oracle扩展,所以我不能使用它.

我相信我可以使用PostgreSQL来实现这一点generate_series,但我希望有一个简单的例子可以证明它是如何用来做到这一点的.

这是我目前正在处理的查询,目前无效(因为我无法FROM在连接的子查询中引用该表),但我相信这或多或少是正确的轨道.

这里是架构,示例数据和我的工作查询的小提琴.

更新:我刚刚发现一个有趣的事实,感谢这个问题,如果你SELECT在查询的一部分中使用set-returning函数,PostgreSQL将"自动"在集合和行上进行交叉连接.我想我已接近完成这项工作.

sql postgresql date-range generate-series

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

Git rebase工作流程 - 将错误修正添加到"稳定"分支

对于我正在研究的这个项目,我们正在使用一个相当标准的git rebase工作流程.也就是说,我们将在feature分支机构中完成所有工作.功能准备好测试后,其他人将:

git checkout master
git merge feature
Run Code Online (Sandbox Code Playgroud)

我们还有一个stable分支,基本上是一个不那么尖端的副本master.在master经过其他人的彻底测试后,有人会:

git checkout stable
git merge master
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是以下情况:

  1. master与之相比stable,有许多新提交,因为刚刚推出了一项新功能用于测试.
  2. 提交master完全没有准备好合并stable.
  3. 发现了一个错误stable,需要立即修复.

我不能简单地添加bugfix stable,然后master在其上面进行rebase ,因为其他人已经检查过了master.我无法添加错误修复master,然后将其合并到stable,因为master包含完全没有准备好使用的提交.最后,我不想只是修正错误的同时添加到年底stablemaster,因为这将使下一个git checkout stable && git merge master突破.

如何调整工作流程以适应这种情况?我想避免重复提交(即,stable以相同的提交两次结束,使用不同的提交哈希)或合并提交.

目前,因为这种情况不上来,很多时候,我只是重订masterstable,并确保每个人都拥有它签出知晓.不过,我想知道是否有更干净的方法来实现这一目标.

git

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