相关疑难解决方法(0)

如何将ctid分解为页码和行号?

表中的每一行都有一个系统列 ctid,其类型tid表示该行的物理位置:

create table t(id serial);
insert into t default values;
insert into t default values;
Run Code Online (Sandbox Code Playgroud)
select ctid
     , id
from t;
Run Code Online (Sandbox Code Playgroud)
ctid | ID
:---- | -:
(0,1) | 1
(0,2) | 2

dbfiddle在这里

ctid最合适的类型(例如integerbigintnumeric(1000,0))中获取页码的最佳方法是什么?

我能想到的唯一的办法是非常难看。

postgresql data-pages datatypes cast postgresql-9.4

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

部分数据库转储/恢复

我的数据库(PostgreSQL 9.3)的一部分依赖于额外的表(例如 County、City、Town...)。我不管理这些表,它们由第三方定期更新。每次我得到一个新的完整转储,但我很难将更改推回我的数据库。

我玩过 pg_dump / restore 并遇到了一些约束问题duplicate key value violates unique constraintcannot drop constraint ... because other objects depend on it甚至使用--disable-triggersor--clean选项。

有没有我错过的选项?我发现有一些方法可以打开/关闭约束,但我不知道这是解决这个问题的好方法还是只是一个肮脏的黑客?(我不是 DBA 专家。)老实说,我很惊讶没有简单的方法来实现这一目标。也许我已经错过了!我天真地认为我可以将 pg_restore 作为一个大事务运行并在脚本末尾检查约束。是否可以?

postgresql duplication restore

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

重复的行 - 如何删除一个?

我有一个包含 OS MasterMap 数据的非常大的表(约 1.14 亿行)。这是新表中新加载的数据。尝试设置主键时,出现此错误:

ERROR:  could not create unique index "tbl_os_mmap_topoarea_pkey"
DETAIL:  Key (toid)=(1000000004081308) is duplicated.
Run Code Online (Sandbox Code Playgroud)

不知何故,我最终得到了一个完全重复的行。这两行中的每个字段都相同。我想删除一行,但保留另一行。由于无法区分两者,如何做到这一点?

我想尽快和尽可能简单地做到这一点。创建临时表等并不是一个真正的选择,因为在这种大小的数据集上需要太长时间。我猜创建一个新的唯一 ID 列会更快,但也可能需要一些时间。

经过一番研究,我了解到 postgres 中的所有记录都有一个隐藏的唯一 ID,即 ctid。我可以用它来删除重复的行之一吗?

postgresql duplication

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

如何删除表中的重复记录?

我有一个包含 1 百万行数据的表 table1。

我想删除table1中的所有重复记录

我在看这个链接:

如何删除 PostgreSQL 连接表中的重复记录?

您能告诉我如何在 SQL Server 中执行以下查询吗?

 DELETE FROM questions_tags q
WHERE EXISTS (
   SELECT 1
   FROM   questions_tags q1
   WHERE  q1.ctid < q.ctid
   AND    q.question_id = q1.question_id
   AND    q.tag_id = q1.tag_id
    );
Run Code Online (Sandbox Code Playgroud)

sql-server duplication

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

表中有一个列,但无法从这部分查询中引用它

我一直在学习Postgres(来自SQL Server),这个错误真的让我很困惑。

\n\n

这是带有一些示例数据的代码:

\n\n
create table T (\nID serial primary key,\nA varchar(1),\nB varchar(1),\nC varchar(1)\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x86\x91 测试表。

\n\n
insert into T (A, B, C)\nvalues('A', 'B', 'C'), ('A', 'B', 'C')\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x86\x91 插入重复项

\n\n
delete from T\nwhere ID in (\n    select t.ID\n    from (  select ID, row_number() over (partition by A,B,C order by A,B,C) as rn\n            from T) as t\n    where t.rn < (select max(t.rn) from t)\n    )\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x86\x91 删除重复项并保留最后一个条目。

\n\n

问题在于(select max(t.rn) from t)我假设这是一个菜鸟错误,与在引用带有别名的列时不知道 postgres 语法有关? …

postgresql duplication subquery

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