相关疑难解决方法(0)

有序序列生成

有没有办法为表记录生成某种有序标识符?

假设我们有两个线程在进行查询:

线程1:

begin;
insert into table1(id, value) values (nextval('table1_seq'), 'hello');
commit;
Run Code Online (Sandbox Code Playgroud)

线程2:

begin;
insert into table1(id, value) values (nextval('table1_seq'), 'world');
commit;
Run Code Online (Sandbox Code Playgroud)

完全可能(取决于时间)外部观察者会看到(2,'世界')记录出现在(1,'你好')之前.

这很好,但是我想要一种方法来获取自上次外部观察者检查它以来出现的'table1'中的所有记录.

那么,有没有办法按照插入的顺序获取记录?也许OID可以提供帮助?

postgresql sequence

10
推荐指数
2
解决办法
3798
查看次数

如何用INSERT更新所有列... ON CONFLICT ...?

我有一个包含单个主键的表.当我尝试插入时,尝试插入具有现有密钥的行可能会导致冲突.我想允许插入更新所有列?这有什么简单的语法吗?我试图让它"upsert"所有列.

我正在使用PostgreSQL 9.5.5.

sql database postgresql insert upsert

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

如何批量更新 postgres 中的单个列 5500 万条记录

我想更新 postgres 表的一列。记录大约有 5500 万条,因此我们需要批量更新 10000 条记录。注意:我们要更新所有行。但我们不想锁定我们的桌子。

我正在尝试以下查询 -

Update account set name = Some name where id between 1 and 10000
Run Code Online (Sandbox Code Playgroud)

我们如何为每 10000 条记录更新创建一个循环?

任何建议和帮助将不胜感激。

PostgreSQL 10.5

sql postgresql plpgsql

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

如何在PostgreSQL(9.1)函数中将字符转换为整数?

我有以下代码:

BEGIN
   x := split_part(text, ',', 1);
   UPDATE albumphoto SET order = 1 WHERE idtable = 1 AND idx = x;   
END
Run Code Online (Sandbox Code Playgroud)

但我的列表名idx是一个数字类型,并split_part返回一个字符类型的变量x.我尝试过使用CAST,但我不知道如何正确使用它.

有任何想法吗?

postgresql types casting postgresql-9.1

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

在MYSQL中使用SELECT DISTINCT

一直在做很多搜索,并没有真正找到我的MYSQL问题的答案.

SELECT DISTINCT name, type, state, country FROM table
Run Code Online (Sandbox Code Playgroud)

结果1,795条记录

SELECT DISTINCT name FROM table
Run Code Online (Sandbox Code Playgroud)

结果共有1,504条记录

对于每个重复的"名称"..."类型","州","国家"在每个记录中不匹配.

试图找出如何将相关行选择为DISTINCT名称,而不检查它们是否为DISTINCT

mysql sql distinct

7
推荐指数
1
解决办法
2万
查看次数

返回在UPDATE中实际更改的表的行

使用Postgres,我可以执行更新语句并返回受推荐影响的行.

UPDATE accounts
SET status = merge_accounts.status,
    field1 = merge_accounts.field1,
    field2 = merge_accounts.field2,
    etc.
FROM merge_accounts WHERE merge_accounts.uid =accounts.uid
RETURNING accounts.*
Run Code Online (Sandbox Code Playgroud)

这将为我提供与该WHERE子句匹配的所有记录的列表,但是不会告诉我操作实际更新了哪些行.

在这个简化的用例中,当然简单地添加另一个防护是微不足道的AND status != 'Closed,但是我的真实世界用例涉及从10,000个行的合并表中更新潜在的几十个字段,我希望能够检测哪些行实际上已经改变了,它们与之前的版本相同.(期望很少的行实际上会改变).

到目前为止我得到的最好的是

UPDATE accounts
SET x=..., y=...
FROM accounts as old WHERE old.uid = accounts.uid
FROM merge_accounts WHERE merge_accounts.uid = accounts.uid
RETURNING accounts, old
Run Code Online (Sandbox Code Playgroud)

这将返回一个新旧行的元组,然后可以在我的Java代码库本身内部进行区分 - 但这需要大量额外的网络流量并且可能容易出错.

理想的情况是能够让postgres返回实际有任何值更改的行 - 这可能吗?

在github上这是一个更真实的例子,我正在做的事情,结合到目前为止的一些建议.
使用Postgres 9.1,但如果需要可以使用9.4.要求是有效的

  • 能够执行新数据的upsert
  • 我们可能只知道要在任何给定行上更新的特定键/值对
  • 获取仅包含upsert实际更改的行的结果
  • 奖金 - 获取旧记录的副本.

由于这个问题已经打开,我现在已经完成了大部分工作,虽然我不确定我的方法是否是一个好主意 - 它有点被黑客攻击.

sql postgresql sql-update

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

从表中删除没有唯一键的重复行

如何在Postgres 9表中删除重复行,每个字段上的行完全重复,并且没有单独的字段可以用作唯一键,所以我不能只GROUP BY使用列并使用NOT IN语句.

我正在寻找一个单独的SQL语句,而不是一个需要我创建临时表并将记录插入其中的解决方案.我知道如何做到这一点,但需要更多的工作来适应我的自动化过程.

表定义:

jthinksearch=> \d releases_labels;
Unlogged table "discogs.releases_labels"
   Column   |  Type   | Modifiers
------------+---------+-----------
 label      | text    |
 release_id | integer |
 catno      | text    |
Indexes:
    "releases_labels_catno_idx" btree (catno)
    "releases_labels_name_idx" btree (label)
Foreign-key constraints:
    "foreign_did" FOREIGN KEY (release_id) REFERENCES release(id)
Run Code Online (Sandbox Code Playgroud)

样本数据:

jthinksearch=> select * from releases_labels  where release_id=6155;
    label     | release_id |   catno
--------------+------------+------------
 Warp Records |       6155 | WAP 39 CDR
 Warp Records |       6155 | WAP 39 CDR
Run Code Online (Sandbox Code Playgroud)

sql postgresql duplicates duplicate-removal

5
推荐指数
2
解决办法
5426
查看次数

使用PL / pgSQL检查密钥是否存在于JSON中?

我正在尝试检查在PL / pgSQL函数中作为参数发送的JSON中是否存在密钥。

这是功能。

CREATE FUNCTION sp_update_user(user_info json) RETURNS json
    LANGUAGE plpgsql
    AS $$
    BEGIN
    PERFORM user_info->>'lastname';
    IF FOUND
    THEN
      UPDATE users SET lastname = user_info->>'lastname' WHERE id = sp_update_user.user_id;
    END IF;

    PERFORM user_info->>'firstname';
    IF FOUND
    THEN
      UPDATE users SET firstname = user_info->>'firstname' WHERE id = sp_update_user.user_id;
    END IF;

    RETURN row_to_json(row) FROM (SELECT true AS success) row;
END;$$;
Run Code Online (Sandbox Code Playgroud)

我尝试使用PERFORM-clause,但是即使json键不存在,该IF FOUND子句中的语句也会执行。

我试图PERFORM user_info->>'firstname' INTO myvar;检查变量内容,但会触发错误ERROR: query "SELECT user_info->>'firstname' INTO myvar" is not a SELECT …

postgresql json plpgsql postgresql-9.3

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

在Postgres中为比赛存储'等级'

我正在尝试确定以下查询是否存在"低成本"优化.我们已经实施了一个系统,"门票"可以获得"积分",因此可以进行排名.为了支持分析类型的查询,我们将每个票证的等级(票证可以绑定)与票证一起存储.

我发现,在规模上,更新此排名非常缓慢.我试图在一组大约20k门票的"门票"上运行下面的场景.

我希望有人可以帮助确定原因并提供一些帮助.

我们在postgres 9.3.6

这是一个简化的票证表架构:

ogs_1=> \d api_ticket
                                             Table "public.api_ticket"
            Column            |           Type           |                        Modifiers                        
------------------------------+--------------------------+---------------------------------------------------------
 id                           | integer                  | not null default nextval('api_ticket_id_seq'::regclass)
 status                       | character varying(3)     | not null
 points_earned                | integer                  | not null
 rank                         | integer                  | not null
 event_id                     | integer                  | not null
 user_id                      | integer                  | not null
Indexes:
    "api_ticket_pkey" PRIMARY KEY, btree (id)
    "api_ticket_4437cfac" btree (event_id)
    "api_ticket_e8701ad4" btree (user_id)
    "api_ticket_points_earned_idx" btree (points_earned)
    "api_ticket_rank_idx" btree ("rank")
Foreign-key constraints:
    "api_ticket_event_id_598c97289edc0e3e_fk_api_event_id" FOREIGN KEY (event_id) …
Run Code Online (Sandbox Code Playgroud)

sql postgresql correlated-subquery sql-update postgresql-performance

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

如果子查询在 Postgres 中返回多行,则跳过行

我想prod_replay_out根据 Postgres 中的子查询结果更新表。但是,子查询返回多行,但我想跳过这些行并根据子查询返回的单行更新表。

我已经提到链接子查询返回超过 1 行错误,max()函数不适用于我的预期结果。您能否为我提供一些修改查询的建议?谢谢你。

prod_replay_out 有以下列:

卖家、买家、sender_tag、seller_tag、买家标签、isin、数量、in_msg_time、msg_type、cdsx_time

prod_replay_in 有以下列:

卖家、买家、sender_tag、seller_tag、买家标签、isin、数量、msg_type、cdsx_time

我尝试过什么?

请在下面找到更新sql:

更新sql:

update prod_replay_out O  
   set in_msg_id = 
        (Select id
           From prod_replay_in I
          Where I.msg_type   = 'CDST010'
            and I.seller     = O.seller
            and I.buyer      = O.buyer
            and I.sender_tag = O.sender_tag
            and I.seller_tag = O.seller_tag
            and I.buyer_tag  = O.buyer_tag
            and I.isin       = O.isin
            and I.quantity   = O.quantity
            and I.cdsx_time  = O.in_msg_time
            and I.cdsx_time::text like '2020-05-12%'
         ) 
where O.msg_type = 'CDST01C'
and O.cdsx_time::text like …
Run Code Online (Sandbox Code Playgroud)

sql postgresql select subquery sql-update

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