有没有办法为表记录生成某种有序标识符?
假设我们有两个线程在进行查询:
线程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可以提供帮助?
我有一个包含单个主键的表.当我尝试插入时,尝试插入具有现有密钥的行可能会导致冲突.我想允许插入更新所有列?这有什么简单的语法吗?我试图让它"upsert"所有列.
我正在使用PostgreSQL 9.5.5.
我想更新 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
我有以下代码:
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,但我不知道如何正确使用它.
有任何想法吗?
一直在做很多搜索,并没有真正找到我的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
使用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.要求是有效的
由于这个问题已经打开,我现在已经完成了大部分工作,虽然我不确定我的方法是否是一个好主意 - 它有点被黑客攻击.
如何在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) 我正在尝试检查在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 …
我正在尝试确定以下查询是否存在"低成本"优化.我们已经实施了一个系统,"门票"可以获得"积分",因此可以进行排名.为了支持分析类型的查询,我们将每个票证的等级(票证可以绑定)与票证一起存储.
我发现,在规模上,更新此排名非常缓慢.我试图在一组大约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
我想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)