我在 PostgreSQL 数据库中有三个表,我通过视图和一些连接进行查询。
CREATE TABLE network_info (
network CIDR NOT NULL,
some_info TEXT NULL,
PRIMARY KEY (network)
);
CREATE TABLE ipaddr_info (
ipaddr INET NOT NULL,
some_info INT NULL,
PRIMARY KEY (ipaddr, some_info)
);
CREATE TABLE ipaddrs (
addr INET NOT NULL,
PRIMARY KEY (addr)
);
CREATE VIEW ipaddr_summary AS
SELECT DISTINCT
i.addr AS ip_address,
a.some_info AS network_info,
COUNT(b.ipaddr) AS ip_info_count
FROM ipaddrs AS i
LEFT JOIN network_info AS a
ON (i.addr << a.network)
LEFT JOIN ipaddr_info AS b
ON …Run Code Online (Sandbox Code Playgroud) postgresql performance join database-design index-tuning postgresql-performance
我已经啮合在一起的方式来确定什么data_type是在data_type创建基于掀起了新表时,你的语法使用PostgreSQL的维基页面。
如果我的查询有问题,我需要真正知道在给定场景中什么会在显式上下文中抛出它在纯粹的测试数据库/表上运行一个或多个查询以修改该数据库/表,所以运行这个查询以测试任何误报。
SELECT pg_attribute.attname,
format_type(pg_attribute.atttypid, pg_attribute.atttypmod),
CASE
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='bigint' THEN 'bigserial'
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='integer' THEN 'serial'
END AS type
FROM pg_index, pg_class, pg_attribute
WHERE pg_class.oid = 'delete2'::regclass
AND indrelid = pg_class.oid
AND pg_attribute.attrelid = pg_class.oid
AND pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary;
Run Code Online (Sandbox Code Playgroud)
这是一个带有主键的表,该表不使用此查询返回主键:
CREATE TABLE delete_key_bigserial (
test1 integer,
id bigserial NOT NULL,
col1 text,
col2 text,
test2 integer
);
Run Code Online (Sandbox Code Playgroud) 我有三个表,代表两个实体和一个连接关系。每个实体关系都有一个人工代理键,用于代替自然键的外键约束。
CREATE TABLE Person (
person_id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE
);
CREATE TABLE Group (
group_id SERIAL PRIMARY KEY,
group_name VARCHAR NOT NULL UNIQUE
);
CREATE TABLE GroupMember (
person_id INTEGER REFERENCES Person,
group_id INTEGER REFERENCES Group,
PRIMARY KEY (person_id, group_id)
);
Run Code Online (Sandbox Code Playgroud)
我想在关系中插入多个条目GroupMember,但使用关联实体的自然键。类似的东西:
INSERT INTO GroupMember (person_id,group_id)
SELECT person_id,group_id
FROM Person P, Group G, (
('alice','girls'),
('bob','boys'),
('alice','coolkids'),
('bob','coolkids')
) AS X
WHERE P.username = X.1 AND G.group_name = X.2;
Run Code Online (Sandbox Code Playgroud)
显然,上述语法无效,但希望能传达这个想法。有没有办法在 PostgreSQL 中做到这一点?
我正在使用Postgres 9.3.
当我更新表中的行时,我的流程如下所示:
SELECT * FROM tbl WHERE id = 1)UPDATE tbl SET .... WHERE id = 1)问题是old数据可能在第 2 点期间发生变化,因此验证,即使通过也可能是outdated在第 3 点(更新行)期间。我知道我可以执行这样的更新UPDATE .... WHERE id = 1 AND column1='oldValue'以确保某些字段不会更改,但是我的验证(也比较新旧值)非常复杂,我无法在 SQL UPDATE 语句中“编写”它。
所以我想到了这样的事情:
BEGINSELECT * FROM tbl WHERE id = 1UPDATE SET=... WHERE id = 1COMMITCOMMIT如果在事务执行期间 id = 1 的行发生更改,我想失败。是否可以使用这样的交易?如果不是,其他解决方案是什么?
这是来自我的数据库的真实结果。我花了一些时间尝试使用 SSCCE 重现此行为,但失败了。下面的最后一个结果怎么可能?
SELECT COUNT(*) FROM rr.resource a
--- 15771
SELECT COUNT(*) FROM rr.resource a
NATURAL JOIN rr.interface b
--- 41419
SELECT COUNT(*)
FROM rr.resource a
NATURAL JOIN rr.interface b
NATURAL JOIN rr.interface c
--- 0
Run Code Online (Sandbox Code Playgroud)
上次查询中的零 (0) 行计数每次都是一致且可重复的。在我创建的一些示例中,向同一个表添加第二个自然连接两次会产生相同数量的行(正如我所期望的)。那么上面的结果怎么可能呢?
我发现以下/sf/answers/679843601/这很好,但对我来说仍然太多体力劳动。我需要以正确的顺序重新创建视图我将如何去做?
@dbenhur 谈到以下内容:
为了更完整,人们可以弄清楚如何查询哪些视图取决于您正在修改的表,并使用该查询而不是枚举视图名称。需要了解 pg_rewrite | pg_rule 来做到这一点,我认为
我不确定这到底是什么意思,但我会告诉你我需要,你告诉我是否可能。
我在一个 rails 应用程序中工作,我试图在其中维护视图和函数作为 rails 迁移的一部分,不幸的是这变得一团糟,我将我们的视图和函数转储到单独的文件中。在我看来,有两种前进的方式。我可以为这些使用单个文件,这使得它很麻烦,但我想 DDL 的顺序将由 pg_dump 管理。
或者,当我转储视图和函数时,我也可以查询并创建一个依赖树,稍后我会用它来重新创建它们。原因是手动更改视图中的列名变得太复杂了。
其他人如何维护他们的 DDL?有人做过我想做的事吗?
我正在运行带有 postgres/postgis 设置的 Ubuntu 14.04,并在一个微弱的时刻删除了 PostgreSQL 9.1(在我升级到 14.04 之前似乎是从 12.04 安装的遗留安装),错误地说服自己我当前的 postgis 设置仅依赖于 9.3。
事实并非如此,更糟糕的是,我在实例运行时将其删除,因此我前往存储库恢复 9.1。
Ubuntu 的存储库没有 14.04 的 PostgreSQL 9.1,所以我从源代码编译,这样我就可以运行 pg_dump 或 pg_upgrade,这需要两者的二进制文件。
但是我当时的问题是,仅仅因为我现在又有了 9.1 的工作版本,这并没有使我的数据库从早期可见。
因此,据我所知,我的数据库文件完好无损,但我需要将它们与我今天安装的新 9.1 服务“挂钩”。我希望它是微不足道的,但它让我难住了几个小时。关于从哪里开始更新配置的任何指示?
所以昨晚我们的 PG Slave 在大量重新配置磁盘空间、新驱动器等后空间不足,现在报告以下错误:
FATAL: could not receive data from WAL stream: FATAL: requested WAL segment 00000001000018F70000008A has already been removed
Run Code Online (Sandbox Code Playgroud)
根据我所做的阅读,似乎唯一的解决方案是使用 pg_start_backup() 等重新同步从站。基于此,我有几个问题。
根据要求,可以找到日志文件:http : //pastebin.com/9F8vJh6R,已删除文件的其余部分,因为它只有 5 个小时的相同重复错误
非常感谢
PostgreSQL 支持使用如下查询检索当前正在运行的事务 ID:
select txid_current();
Run Code Online (Sandbox Code Playgroud)
MySQL 有没有这样的等价物?
如何使用 Postgres 将 sql 查询结果放入字符串数组中?我在表 'mytable' 的 'zone' 列中有一些属性,我必须把它们全部放在 aString[] areas;
这是我的第一个请求,如果我犯了一些格式错误,抱歉。
postgresql ×10
join ×2
aggregate ×1
array ×1
c# ×1
catalogs ×1
datatypes ×1
index-tuning ×1
insert ×1
migration ×1
mysql ×1
performance ×1
primary-key ×1
sequence ×1
transaction ×1