psql\i命令能够执行给定的 SQL 脚本,但我需要一种将参数传递给脚本的方法。
示例:假设您有这个简单的脚本
select * from :table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
我试过了
my_db=> \i my-script.sql -v table="core.product"
Run Code Online (Sandbox Code Playgroud)
但出现这个错误
psql:my-script.sql:1: ERROR: syntax error at or near ":"
LINE 1: select * from :table LIMIT 1;
^
\i: extra argument "-v" ignored
\i: extra argument "table="core.product"" ignored
Run Code Online (Sandbox Code Playgroud)
我知道在终端上运行它会起作用,但我已经在 psql 中了。
psql -v table="core.product" -f my-script.sql
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以(和/或可取)创建对值进行约束的自定义类型。假设我有一个高度/宽度/长度的自定义类型:
CREATE TYPE dimensions AS (w float, h float, l float);
我想确保我的宽度都不大于 10(例如)。
这样的事情可能吗,或者我会更好地在使用这种类型的每个表上创建检查约束吗?我希望能够在单个位置(即类型本身)添加/编辑约束。
谢谢!
我正在尝试更改我已经是所有者的表的所有权。我也是数据库的所有者,并且拥有 PUBLIC 模式的 CREATE 和 USAGE 权限。我收到以下错误消息:
ts_d=> ALTER TABLE table1 OWNER TO user2;
ERROR: permission denied for schema public
Run Code Online (Sandbox Code Playgroud)
如何在不以超级用户身份登录的情况下更改所有权?
我计划将我的数据库从 Postgres 10 升级到 Posgres 14。为了减少停机时间,我计划使用复制来实现同样的目的。计划(简而言之)是:
pg_dumpall对此我有几个问题:
pglogical可以用于设置的扩展。尽管如此,我还没有深入挖掘。根据您的经验,它是否具有任何额外的优势\是否会使设置更容易?我在使用内部联接从两个表中获取唯一值时遇到问题。
\nSELECT distinct cast (opd.order_number as integer), p.payment_id ,\n pt.transaction_status, \n opd.installments_number, \n pt.amount, \n pt.origin_amount,\n p.payment_capture_type,\n opd.brand,\n pt.created_date, \n d."name" \nFROM payment p \nINNER JOIN payment_transaction pt ON pt.payment_id = p.payment_id\ninner join "domain" d on d.domain_id = p.domain_id \nINNER JOIN attempted_online_payment_data opd ON p.payment_id = CAST ( opd.order_number AS INTEGER )\nWHERE \np.created_date >= \'2021-11-01\' and status = 1\nRun Code Online (Sandbox Code Playgroud)\n这是我正在使用的查询,我想要一个 payment_id\xc2\xb4s 的唯一值列表,但是当我这样做时,由于某种原因它会带来两个相同的 payment_id。
\n\n如何为每个 payment_id 获取唯一的行?
\npg_catalog我了解和之间的高级差异information_schema。
但在许多情况下,工具可以选择使用其中任何一个。我想知道是否存在性能原因导致我们应该选择其中之一。其中之一的查询预计会更快吗?它们在锁方面的工作方式相同吗?
我有一个 PostgreSQL 服务器,其中包含许多数据库。随着时间的推移,这个数字在 20 到 30 之间变化。
其中一些数据库包含我们希望获得最佳保护的真实生产信息。所以我为他们激活了PITR(wal log backup)。
但其他一些只包含不可变的信息或可以以较少成本重建的信息。对于这些,我们根本不想进行备份,或者每天一个 pg_dump 之类的东西就足够了。
我遇到的问题是,激活 PITR Postgres 后正在保存所有数据库的日志。而且有些第二类数据库的修改率非常大,导致日志占用了巨大的空间。
我希望仅对某些表空间激活 PITR(例如)。这将使我能够将数据库放置在正确的表空间中,以获得我们需要的保护级别。
但我一直无法找到实现这一目标的方法。
有关于该设置的经验吗?
谢谢!
我犯了一个小错误,我的 VACUUM FULL 最终填满了实例的磁盘。我设法释放足够的空间来重新启动 postgres,但恐怕不足以运行 VACUUM FULL 来完成。
有什么方法可以释放失败的 VACUUM FULL 运行所使用的空间吗?
PS:这是我使用的选项VACUUM (FULL, VERBOSE, ANALYZE, INDEX_CLEANUP)
我有以下查询:
INSERT INTO ReservationCounter (student_id, reservation_count) VALUES (1, 1)
ON CONFLICT (student_id) DO
UPDATE SET reservation_count=excluded.reservation_count+1;
Run Code Online (Sandbox Code Playgroud)
当没有冲突时就INSERTS成功了。
然而,当存在冲突时,该UPDATE语句实际上并不用增量更新值。
当我第一次在冲突时运行它时,它会按预期返回 2,但是当我再次运行它时,我希望它会增加 2 到 3(因为reservation_count=excluded.reservation_count+1)。它没有这样做,它再次返回 2;让我相信那reservation_count总是 1。
我究竟做错了什么?
我正在尝试安装支持在 postgresql 中编写 python 的扩展“plpython3u”。
CREATE EXTENSION plpython3u;
错误:
SQL 错误 [22023]:错误:Amazon RDS 不支持扩展“plpythonu”详细信息:安装扩展“plpythonu”失败,因为它不在 Amazon RDS 支持的扩展列表中。
提示:Amazon RDS 允许具有 rds_superuser 角色的用户安装支持的扩展。请参阅:SHOW rds.extensions;
你能推荐一个解决方案吗?
我们正在运行以下版本的 postgresql:
x86_64-pc-linux-gnu 上的 PostgreSQL 12.7,由 gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12) 编译,64 位
postgresql ×10
datatypes ×1
distinct ×1
join ×1
permissions ×1
pg-catalog ×1
pg-logical ×1
plpython ×1
psql ×1
query ×1
replication ×1
upgrade ×1
upsert ×1
vacuum ×1