我用来备份我的数据库pg_dump -cF p my_db > snapshot.sql
。
如何仅从其中一个文件中恢复数据(假设架构有效)?我是否必须在其中发布所有 COPY 语句,还是有更直接的方法?
我用来备份我的数据库pg_dump -cF p my_db > snapshot.sql
。
如何仅从其中一个文件中恢复数据(假设架构有效)?我是否必须在其中发布所有 COPY 语句,还是有更直接的方法?
我敢肯定这已经被问过,但由于这个问题可以用许多不同的方式来表述,所以很难找到正确的答案。
我有一个订单表,其中订单号的varchar字段的格式为 4 位数年份、破折号 (-) 和渐进数值。例如,它可能包含以下值:
SELECT number FROM orders ORDER BY number LIMIT 10;
number
----------
1999-13
2019-11
2020-1
2020-10
2020-100
2020-12
2020-2
2020-21
2020-3
2021-1
我需要按年份对该字段进行排序,然后按累进数字排序,得到以下预期结果:
number
----------
1999-13
2019-11
2020-1
2020-2
2020-3
2020-10
2020-12
2020-21
2020-100
2021-1
我的问题是:
我想至少将第一个答案保留为与数据库无关(这就是为什么我没有包含特定于 db 的标签的原因),但是如果不同的 DBMS/版本可能有不同的最佳答案,那么假设 PostgreSQL 12。
TL;DR:如果数据库模式应该包含所有业务逻辑,那么如何指定属性类型是对特定属性的引用,而不是特定记录(如外键的情况)?
举个例子,假设我有一个表,其中有一"Discounts"
列"share"
包含要应用于 column 或 table 值"cost"
的百分比。"price"
"shipping"
"Items"
"Discounts"
还拥有一个外键"item_id"
。
我需要在"base"
表"Discounts"
中添加另一列来存储对 table 列之一的引用"Items"
,并计算该列值的百分比。
例如,给定这些值:
Discounts
share base item_id
-------------------------------------
50 (item's cost) 3
25 (item's price) 1
100 (item's shipping) 2
Items
id cost price shipping
-------------------------------
1 10 40 20
2 55 60 30
3 50 85 10
我希望能够计算:
列“base”不应包含引用列的数字(例如 3)或名称(例如“price”),因为每个表的名称或顺序可能会更改。特别是数据库对列(属性)顺序或行(记录/元组)顺序没有任何了解,事实上,RDB 理论断言“关系的元组没有特定的顺序,而元组反过来, 对属性没有顺序。»
相反,如果我们依赖列名,我们应该强制每个条目包含一个有效的属性名,并且每当属性名更改时,我们必须更改其记录、约束和应用程序的验证。如果名称在多个关系中被引用,那么维护数据库完整性就变得非常复杂。
这里的问题是我们没有在数据库模式中写入对属性名称的引用(就像我们添加外键时一样),而是写入数据本身,这似乎是一种非常糟糕的做法,因为它威胁到引用完整性。
如果没有与数据库无关的方法来执行此操作,则假设数据库是 PostgreSQL (v12+)。
表 A 是一个列表,"products"
表 B 是一个"orders"
参考产品列表(使用product_id
),以及购买者信息 ( buyer_name
ecc) 和购买quantity
的每个产品。
一个订单有很多产品和一个买家,因此当一个买家发出订单时,对于每个订购的产品以及所需的 ,将具有相同buyer_name
行的行order_no
插入表B。quantity
这是加入最快的两个查询"products"
,"orders"
因此对于每一"products"
行我也quantity
有指定买家订购的:
order_no
指定)quantity
在他的所有订单中(买方发出的每个订单的总和)为了提高效率,所有"orders"
不属于指定买家(并且没有order_no
为第一个查询指定)的行都应该在连接之前被排除,但是每一行都"products"
应该被返回,即使产品没有从买家那里订购(quantity
应该是0
在这种情况下)。
更新(来自评论):
当前查询:
SELECT p.*, o.buyer_name, coalesce(o.quantity,0)
FROM products p
LEFT JOIN (SELECT *
FROM orders
WHERE buyer_name='Joe'
AND order_no=123
) AS o USING(product_id)
我现在没有遇到性能问题,也不想严格调整这个特定的查询,但要确保我在总体上有效地编写查询。同样,当前的 DBMS 是 PostgreSQL 9.4.4 - 但正在寻找适用于大多数 SQL 变体的通用建议。
取以下两张表:
table A
有大约 100k 行和 50 列,并且每月仅更新两次,此更新需要多长时间不是问题(只要不超过一天,我认为这不太可能:D)。它将非常轻微地增长,每年不超过 10k 行。table B
有 ~25k 行和 25 列,是ofcolumn F
的外键。这张表每天更新 100-1000 次,大部分时间是添加新行,所以很容易增长到几十万行。column C
table A
Table A
与 具有一对多关系table B
,两者column F
且column C
必须不为空,有自己的索引,并且column C
也是唯一的但不是 的主键table A
。的每一行与table B
中的一行都有唯一的对应关系table A
。
这两个表每天都被查询数千次,单独或使用允许几十种不同类型查询的应用程序使用它们的关系。
为查询中涉及的每一列建立索引,并为每种类型的查询建立一个复合索引是一个好主意吗?如果没有,可能的缺点是什么?table A
因为只为最耗时的查询table B
创建复合索引是个好主意吗?或者我应该为正在查询的每一列创建一个复合索引,因为这些查询可能在参数上有所不同,但在形式上却没有?table B
比方说,我有一张表格,代表编号框内的彩色和标记项目。
每个箱子不能包含超过一件带有特定标签的物品,但具有相同标签(以及相同或不同颜色)的物品在其他箱子中可能是独一无二的。
过度简化并使用 PostgreSQL,我们可以采用下表:
CREATE TABLE items (
label character varying,
color character varying,
box_number integer
);
INSERT INTO items VALUES
('a','red',1),
('b','blue',1),
('c','blue',1),
('a','red',2),
('c','green',2),
('d','blue',2),
('b','red',3),
('d','green',3);
我想知道 3 号箱子内所有物品的标签和颜色,以及可以找到具有相同标签的物品的所有箱子号。换句话说,我正在尝试:
SELECT label, boxes
FROM (
SELECT label, array_agg(DISTINCT box_number) AS boxes
FROM items
GROUP BY label
) AS sub1
WHERE 3 = ANY(boxes);
但我还需要返回该color
列,仅显示 3 号框内项目的颜色。
对于示例数据,输出应该是这样的:
标签 | 颜色 | 盒子 ------+--------+----- 乙 | 红色 | 1,3 d | 绿色 | 2,3