我正在对配置文件进行一些更改时遇到问题。我认为 PostgreSQL 没有使用我正在修改的那些。有什么方法可以让 postgres(可能是一些环境变量)告诉我在哪里可以找到各种配置文件,包括pg_hba.conf和pg_ident.conf?
PostgreSQL 有一个包含不同高可用性选项的矩阵,这些选项代表了将复制构建到 RDBMS 中的许多不同方式。
问题
我有多个数据库服务器,我正在使用将过期列与now(). 问题是服务器的过期列之一是timestamp with time zone,其余的都是date。我无法更改此设置,因为我没有管理员访问权限,而且实际上我只是在查询视图。Postgres 对我来说相当陌生,所以我真的不明白日期和时间是如何相互配合的。
当我尝试timestamp with time zone通过将timestampa转换为 a 来查询服务器时date:
...
WHERE
(
status_code = '30000'
OR status_code = '30005'
)
AND CAST(expiration AS DATE) > now()
Run Code Online (Sandbox Code Playgroud)
它有效,但在expiration已经date失败的服务器上使用相同的查询:
[Err] 错误:类型日期的无效输入语法:“无结束日期”
任何帮助将不胜感激,我真的不想硬编码这个数据库服务器的异常。
PostgreSQL 9.2 引入了json字段类型。为什么以及何时应该使用它?它比文本字段有什么好处?
我以为有新的查询选项可用,但我没有看到任何选项。我错过了什么吗?
这是我目前正在使用的:
CREATE FUNCTION array_intersect(a1 anyarray, a2 anyarray)
RETURNS anyarray AS
$$
SELECT ARRAY(
SELECT unnest($1)
INTERSECT SELECT unnest($2)
ORDER BY 1
);
$$ LANGUAGE sql
IMMUTABLE STRICT;
--get the length:
select array_length ( array_intersect(array[...], array[...]), 1);
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法?
我正在尝试创建一个 Postgres 触发器,以确保在设置列的值后,它无法更新(基本上使其成为只读)。到目前为止,我已经提出了以下草案触发器。
1) 首先,我在正确的轨道上吗?
2) 有回报价值NEW吗?
3) 我必须original_id以NEW.?
CREATE FUNCTION check_id_change() RETURNS TRIGGER AS $$
BEGIN
IF OLD.original_id <> NEW.original_id THEN
RAISE EXCEPTION 'cannot change original_id';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER client_update_trigger AFTER UPDATE ON client FOR EACH ROW
EXECUTE PROCEDURE check_id_change();
Run Code Online (Sandbox Code Playgroud) 是否可以将 JSON 对象键作为 PostgreSQL 中的值数组返回?
在 JavaScript 中,这只是Object.keys(obj),它返回一个字符串数组。
例如,如果我有一张这样的表:
tbl_items
---------
id bigserial NOT NULL
obj json NOT NULL
Run Code Online (Sandbox Code Playgroud)
如果有这样的一行:
id obj
----- -------------------------
123 '{"foo":1,"bar":2}'
Run Code Online (Sandbox Code Playgroud)
我怎样才能有一个查询返回:
id keys
----- ------------------
123 '{"foo","bar"}'
Run Code Online (Sandbox Code Playgroud) 我无法让 INSTEAD OF 触发器正常工作,而且我想我误解了如何使用 NEW。考虑以下简化场景:
CREATE TABLE Product (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR
);
CREATE TABLE Purchase (
purchase_id SERIAL PRIMARY KEY,
product_id INT REFERENCES Product,
when_bought DATE
);
CREATE VIEW PurchaseView AS
SELECT purchase_id, product_name, when_bought
FROM Purchase LEFT JOIN Product USING (product_id);
Run Code Online (Sandbox Code Playgroud)
我希望能够创建INSTEAD OF触发器以允许我直接插入到 中PurchaseView,例如:
INSERT INTO Product(product_name) VALUES ('foo');
INSERT INTO PurchaseView(product_name, when_bought) VALUES ('foo', NOW());
Run Code Online (Sandbox Code Playgroud)
我的想法是这样的:
CREATE OR REPLACE FUNCTION insert_purchaseview_func()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO Purchase(product_id, when_bought) …Run Code Online (Sandbox Code Playgroud) 如何为 DDL 中的列指定默认值?我很确定以下方法不久前有效:
CREATE TABLE test
(
col_1 CHAR(12) NOT NULL,
col_2 INTEGER NOT NULL WITH DEFAULT,
col_3 CHAR(12) NOT NULL WITH DEFAULT
);
Run Code Online (Sandbox Code Playgroud)
我只想定义 DB 应该使用列数据类型的默认值(就像我上面的例子一样),而不是具体指定哪个值。
在 Postgres 12 中,我正在跟踪照片。每个都很大,每个大约 6 到 8 兆。为了快速浏览,我将与完整图像一起存储缩略图。full 和thumbnail 都是 BYTEA 类型的列。
为了性能,我想避免在只需要缩略图时加载完整图像。据我了解,访问一行时,所有 BYTEA 字段值都将加载到内存中。因此,即使在查询中没有明确请求,向用户显示缩略图列表也必然会在服务器上加载完整的照片。
因此,我将把照片表分成两部分,将缩略图存储在主表中,并将缩略图存储在单独的子表中,以一对一的方式。
在这种情况下,子全图表携带其父缩略图行的 ID 作为外键。该外键列在逻辑上也可以用作主键。
我可以指定子项的一列既是外键又是主键吗?如果是这样,是否有任何需要注意的注意事项?
postgresql ×10
array ×2
datatypes ×2
json ×2
trigger ×2
date-format ×1
ddl ×1
foreign-key ×1
oracle ×1
performance ×1
plpgsql ×1
primary-key ×1
syntax ×1
timestamp ×1