我有两个结构相同的表,A 和 B。编写了某个应用程序,以便它始终将相同的数据写入两个表。
在与同事讨论节省驱动器空间的潜力后,我想知道 mysql 或 postgresql 是否能够在表上创建另一个表的“别名”或“符号链接”。
我希望行为与软文件符号链接的行为非常相似;从符号链接本身或其目标读取将产生相同的输出,写入任一将更新目标。
我有一个名为“Account”的表,它是一个经常使用的表,有 17 列,有超过 300,000 行。我正在尝试创建一个新表“NewTable”,它对“Account”表具有外键约束。
我的 CREATE TABLE 语句如下所示:
CREATE TABLE "NewTable"
(
"column1" VARCHAR(100) NOT NULL,
"column2" INTEGER NOT NULL,
PRIMARY KEY("column1")
CONSTRAINT "SomeFK" FOREIGN KEY ("column2") REFERENCES "Account" ("ID")
)
Run Code Online (Sandbox Code Playgroud)
上述语句执行了超过 25 分钟并没有完成。我们终止了交易。
当我们移除外键约束时,它会立即执行。
有人可以让我们知道是什么问题吗?我们最初认为它出于某种原因锁定了“Account”表,但是当我们查看“pg_locks”时,我们没有找到“Account”的任何条目——只有“NewTable”的独占锁。
我发现自己写了以下内容:
select 'yes'
where exists(select * from foo where val=1)
and not exists(select * from foo where val<>1);
Run Code Online (Sandbox Code Playgroud)
并想知道是否有更简洁的方法而不牺牲太多的可读性。
我找到了一种作为答案发布的方法,但我对此并不完全满意,并且对替代方案非常感兴趣
在这种情况下val是唯一的foo- 没有重复
由于在这种模式下 pgbouncer 为每个入站连接创建出站连接,因此在我看来 pgbouncer 不能作为池化器工作。这只是1对1的映射。
我哪里错了?
希望为一系列物质计算最合适的计量单位,其中物质以不同(但兼容)的单位体积给出。
单位转换表存储各种单位以及这些单位之间的关系:
id unit coefficient parent_id
36 "microlitre" 0.0000000010000000000000000 37
37 "millilitre" 0.0000010000000000000000000 5
5 "centilitre" 0.0000100000000000000000000 18
18 "decilitre" 0.0001000000000000000000000 34
34 "litre" 0.0010000000000000000000000 19
19 "dekalitre" 0.0100000000000000000000000 29
29 "hectolitre" 0.1000000000000000000000000 33
33 "kilolitre" 1.0000000000000000000000000 35
35 "megalitre" 1000.0000000000000000000000 0
Run Code Online (Sandbox Code Playgroud)
按系数排序表明将parent_id子单元与其上级数值联系起来。
可以使用以下命令在 PostgreSQL 中创建此表:
CREATE TABLE unit_conversion (
id serial NOT NULL, -- Primary key.
unit text NOT NULL, -- Unit of measurement name.
coefficient numeric(30,25) NOT NULL DEFAULT 0, -- Conversion value.
parent_id integer …Run Code Online (Sandbox Code Playgroud) 我寻找一种简单的方法来选择除 psql 中的一列之外的所有列。
随着psql我的意思是交互式命令行。
我会很高兴有一个工具可以扩展到*引用的列名列表。然后我可以移除列以手动移除。
我的问题只是关于 psql 的交互使用。它不是那些对 sql 标准不满意并且想要执行诸如“select *-foo”之类的问题的人的问题的重复。
在最简单的情况下,当我们向表中插入新行(并且事务提交)时,它将对所有后续事务可见。请参阅xmax此示例中的 0:
CREATE TABLE vis (
id serial,
is_active boolean
);
INSERT INTO vis (is_active) VALUES (FALSE);
SELECT ctid, xmin, xmax, * FROM vis;
ctid ?xmin ? xmax ? id ? is_active
?????????????????????????????????????
(0,1) ?2699 ? 0 ? 1 ? f
Run Code Online (Sandbox Code Playgroud)
当我们更新它时(因为该标志是FALSE偶然设置的),它会发生一些变化:
UPDATE vis SET is_active = TRUE;
SELECT ctid, xmin, xmax, * FROM vis;
ctid ? xmin ? xmax ? id ? is_active
?????????????????????????????????????
(0,2) ? 2700 ? 0 ? 1 ? t
Run Code Online (Sandbox Code Playgroud)
根据PostgreSQL 使用的 …
在 SELECT 语句中,如果未指定 ORDER BY 子句,则不能保证返回行的顺序。这适用于“普通”表。
对于使用 WITH 表达式 (CTE) 生成的有序表也是如此吗?函数返回的有序表?我认为不是。这是文档中明确说明的地方吗?
具体来说,我可以假设这个(更有效的)查询:
WITH ordered AS ( SELECT * FROM table1 ORDER BY col1 )
SELECT sum(col2) result FROM
generate_series(0,50) nr,
LATERAL (SELECT * FROM ordered LIMIT 100 OFFSET nr*100) a
GROUP BY nr ORDER BY nr;
Run Code Online (Sandbox Code Playgroud)
将等同于这个查询:
SELECT sum(col2) result FROM
generate_series(0,50) nr,
LATERAL (SELECT * FROM table1 ORDER BY col1 LIMIT 100 OFFSET nr*100) a
GROUP BY nr ORDER BY nr;
Run Code Online (Sandbox Code Playgroud)
对于函数:
如果我有这样的功能:
CREATE FUNCTION do_sort(name text[]) RETURNS TABLE(name …Run Code Online (Sandbox Code Playgroud) 我正在考虑将当前的 PostgreSQL 数据仓库迁移到具有 SSD 存储和 RAM 作为主要大小变量之一的云主机。我们目前处理的最庞大的数据将存在于每月分区表中。每个月大约有 70GB 的索引(40-ish w/o)。数据可能主要是定期批量加载,然后由 5 名研究人员组成的小团队访问。
我一直在尝试在此站点上搜索有关规范 RAM 的建议,我发现的所有内容是:
是否应该有足够的 RAM 来至少将整个索引 (16GB) 加载到 RAM?我还需要提供其他详细信息吗?
我有一个函数 build_details(),它将另一个表中的单行/记录作为其参数之一。
这是我想要做的,但它不起作用:
SELECT build_details(
SELECT * FROM my_table LIMIT 1,
1000,
TRUE)
Run Code Online (Sandbox Code Playgroud)
我想从 my_table 中取出一行并将其传递给函数,以便我可以运行它。如何使用 my_table 中的记录从终端调用该函数?
postgresql ×10
duplication ×1
foreign-key ×1
memory ×1
mvcc ×1
mysql ×1
order-by ×1
pgbouncer ×1
plpgsql ×1
psql ×1