我不确定这是否适合这个地方,所以请随时告诉我它是否偏离主题或有更好的发帖地方。
我正在做一个基于幻想体育的项目,桌子的数量越来越多。我有诸如nba_players,nfl_players等和nba_players_to_teams,nfl_players_to_teams等表(NBA 和 NFL 分别是篮球和美式橄榄球联盟)。这些都共享相同的表模式和代码库,但在不同的表上有它们的外键。
我的问题是,在这种情况下使用表继承有意义吗?“基”表将是空的,仅用于强制执行模式。对“基”表的更改会传播到从它继承的表吗?在这一点上,模式非常稳定,所以这不是一个大问题。
有没有我没有解决的想法或疑虑?我仍在阅读有关表继承及其优缺点的文章,但您拥有的任何资源都将不胜感激。
我有一个带有主表和 2 个子表的 PostgreSQL 9.0.12 数据库。我的表:
CREATE TABLE test2 (
id serial PRIMARY KEY,
coll character varying(15),
ts timestamp without time zone
);
CREATE INDEX ON test2(ts);
CREATE TABLE test2_20150812 (
CHECK ( ts >= timestamp '2015-08-12' AND ts < timestamp '2015-08-13' )
) INHERITS (test2);
CREATE TABLE test2_20150811 (
CHECK ( ts >= timestamp '2015-08-11' AND ts < timestamp '2015-08-12' )
) INHERITS (test2);
CREATE INDEX ON test2_20150812(ts);
CREATE INDEX ON test2_20150811(ts);
VACUUM FULL ANALYZE;
Run Code Online (Sandbox Code Playgroud)
我的选择查询的解释结果(数据库中没有任何行):
EXPLAIN (ANALYZE, BUFFERS) …Run Code Online (Sandbox Code Playgroud) 是否可以FOREACH在 PL/pgSQL 中循环多个数组?就我而言,3 个具有相同维度的数组。我如何传递元素,如:
for(int i = 0 ; i < array1.length ; i++){
my_method(array1[i], array2[i], array3[i]);
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
select dugong.session_hugeInsert( 3, '5,2,3,1', '4,3,3,2');
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)NOTICE: The transaction is in an uncommitable state.Transaction was rolled back. NOTICE: query "SELECT Question_ID, UserResponseID_List, UserResponseList" returned 3 columns 42601 ERROR: cannot begin/end transactions in PL/pgSQL HINT: Use a BEGIN block with an EXCEPTION clause instead. CONTEXT: PL/pgSQL function dugong.session_hugeinsert(integer,text,text) line 61 at SQL statement
我的功能:
CREATE OR REPLACE FUNCTION Dugong.Session_hugeInsert(
Quiz_ID_ int, …Run Code Online (Sandbox Code Playgroud) 有没有办法在 Postgres 9.3.9 中记录单个连接或用户或客户端主机的所有 SQL 查询?
换句话说,我log_statement = all只想要某个用户名或客户端主机名或客户端 IP 或连接 ID。
一种选择是记录所有客户端的 SQL 活动并搜索日志。我希望有更好的方法。
BEGIN;
INSERT INTO foo_table(foo_column) VALUES('a'),('b'),('c');
-- SELECT * FROM pg_stat_activity WHERE ...
-- shows records with a flag if they have been added/deleted/updated
END;
Run Code Online (Sandbox Code Playgroud)
有没有办法查看 PostgreSQL 9.x 中给定表的事务未提交的插入/删除?这纯粹是为了视觉确认。
虽然我最初的想法是否定的(只对表执行 SQL-Select),但某些用户想要可视化事务中的差异。如果有很多保存点和事务,我可以看到这会有什么帮助。因此,值得向整个社区询问。
我面临一个绝对奇怪的问题,感觉更像是 Postgres 错误而不是算法问题。
我有这个功能:
CREATE FUNCTION sp_connect(mail character varying, passwd character varying, role character varying)
RETURNS json LANGUAGE plpgsql STABLE AS
$$
DECLARE
user_info record;
BEGIN
IF role = 'Role1' THEN
SELECT u.id, r.name INTO user_info
FROM users u
INNER JOIN users_roles ur ON ur.user_id = u.id
INNER JOIN roles r ON ur.role_id = r.id
WHERE u.email = mail
AND u.password = encode(digest(CONCAT(passwd, u.password_salt), 'sha512'), 'hex')
AND r.name = 'Role1';
ELSIF role = 'Role2' THEN
SELECT h.id, 'Role1' AS name …Run Code Online (Sandbox Code Playgroud) 我一直试图找到一种可靠且经济的方法来计算 7 天的行数,到目前为止,这是我能想到的最好方法:
架构
CREATE TABLE IF NOT EXISTS "data" (
"id" SERIAL,
"hash" CHARACTER VARYING(255) NOT NULL,
"source" CHARACTER VARYING(255) NOT NULL,
"isFiltered" BOOLEAN NOT NULL,
"campaignId" INTEGER NOT NULL,
"data" JSON NOT NULL,
"meta" JSON NOT NULL,
"modifiedReason" CHARACTER VARYING(255) NULL DEFAULT NULL,
"createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "campaign" (
"id" SERIAL,
"userId" INTEGER NOT NULL,
"userCompanyId" INTEGER NOT NULL, …Run Code Online (Sandbox Code Playgroud) 我经常需要在应用程序中克隆行,所以我会花很长的时间来完成它:
INSERT INTO mytable (a, b, c)
SELECT a,b,c FROM mytable WHERE id=12;
Run Code Online (Sandbox Code Playgroud)
(id 被声明为 a SERIAL PRIMARY KEY, 12 是要克隆的行)。
问题是,当我添加新字段时,mytable我必须记住更新克隆函数以也克隆这些新字段。
我想以更易于维护的方式克隆行。就像是 :
INSERT INTO mytable
SELECT *, id:DEFAULT FROM mytable WHERE id=12;
Run Code Online (Sandbox Code Playgroud)
在我编写本文时,我还认为克隆详细信息行会很好:如果我有一个使用引用完整性声明的详细信息/子表,如下所示:
CREATE TABLE mychild (
id serial PRIMARY KEY,
parentid int REFERENCES mytable(id),
a text
);
Run Code Online (Sandbox Code Playgroud)
我可以用一个命令克隆 mytable 和所有子表,而不是:
idmychild,设置parentid为新的idPostgreSQL(或扩展)中是否有任何内容可以帮助处理这些情况?
我对 Postgres 中的模式所有者感到困惑。
当我使用AUTHORIZATION关键字定义的所有者创建模式时,所有者可以在该模式中创建对象(pgAdmin4 中的该模式没有显示显式权限)。
但是,当我将架构所有者更改为另一个角色时,此角色无法在该架构中创建对象(除非我明确授予USAGE和CREATE)。
我想,该架构所有者具有对架构执行任何操作的隐式特权。更改架构所有者芯片的正确方法是什么?
使用 Postgres 9.4,我有一个page_views包含一page列的表。我想选择所有不同的页面并在它们之前进行计数并按降序对它们进行排序。我还希望在过去 24 小时内最少计数 20。所以它看起来像这样:
120 / home
56 / about
24 / locations
Run Code Online (Sandbox Code Playgroud)
我刚在想:
select count(*),page from page_views group by page where count(*) > 20;
Run Code Online (Sandbox Code Playgroud)
但这不起作用。这该怎么做?
postgresql ×10
inheritance ×2
plpgsql ×2
aggregate ×1
array ×1
functions ×1
index ×1
insert ×1
log ×1
partitioning ×1
permissions ×1
plan-cache ×1
transaction ×1