嗨,我是一名土木工程师,有一些编程经验,但我不熟悉当今可用的大量选项。希望你能给我任何指示最好的方法。
我想以网格格式制作和查询地面测量数据的数据库。在土方作业的不同时间,每个网格位置都会有许多测量值,因此存在时间的第 4 维。
观察结果很可能是从文本文件中读入的。在每条记录中都会有一个(2 x 整数)网格位置(行和列)一个(浮点)地平面和各种字符串信息代码(总共可能多达 30 个字符)。
网格可以是大约 10000 行 x 10000 列。并非网格上的每个位置在每次调查中都有记录,但通常最多有一百条记录。许多网格位置根本没有记录(该站点不会是完美的矩形)。
我想搜索记录、提取数据并进行计算,例如计算每个网格位置的最低或最高地平面。我相当有信心,我有能力用诸如 FORTRAN、BASIC 或 C 之类的语言使用数组相当简单地进行编程。虽然很多数组元素都是空的,但我猜这不是正确的方法,像这样的大型数据库需要特殊的工具,我必须学习如何使用。
我正在考虑平台的可能选项 -
使用数据库程序。我不熟悉这些功能有多强大,但我想它们会在 GUI 上产生很多开销。
使用 SQL?这我不太了解,但它似乎是数据库的语言。我一直使用命令式语言而不是声明式语言,正如我从维基百科了解到 SQL 是声明式的,我对这种变化有点紧张。我不完全了解使用它的过程。是否有制作控制台程序的编译器?数据库是否存储在磁盘上?抱歉问了这么愚蠢的问题。
使用像 c-treeACE 这样的 API?我认为这可能是让我熟悉“做这个,然后做那个”语言的方式(不幸的是,这就是我作为工程师的想法!)。但我希望 API 提供的幕后内存和处理管理将优于我使用大型数组所能实现的。
或者我可以用面向对象的语言来做,让计算机担心存储要求。例如,如果我将记录存储为具有方法和属性的对象,这些方法和属性可以帮助我从每条记录中获得我需要的结果 - 与 3 相比,它会是一个巨大的臃肿程序吗?
可能有数亿条记录,我希望能够在运行 Windows 的现代 PC 上在几分钟而不是几小时(最好是几秒钟!)内查询和处理它们。更具体地说,我的是带有 6Gb ram 和 120Gb SSD 的 i7 处理器,运行 Windows 7 64 位。
希望有人有时间与新手分享几句智慧之词。
我已经用我创建的 4 个角色遇到了这个问题:
使用 GUI (1) 在 pgAdmin III 中更改用户的密码后,该用户无法再登录。
pgAdmin III 显示错误信息:
An error has occurred:
Error connecting to the server: FATAL: password authentication failed for user "sam"
FATAL: password authentication failed for user "sam"
Run Code Online (Sandbox Code Playgroud)
我的系统:Ubuntu 12.04 上的 Postgresql 9.2
有没有什么办法解决这一问题?
(1): 使用 postgres 帐户登录,在登录角色中右键单击用户,转到“定义”选项卡并输入密码
Microsoft 当前允许使用此语法。
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT *
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) > 1
);
Run Code Online (Sandbox Code Playgroud)
请注意,没有GROUP BY中EXISTS条款,是有效的ANSI SQL。或者它只是暴露了一个实现细节。
作为参考,PostgreSQL 中不允许使用相同的语法。
错误:列“tx”必须出现在 GROUP BY 子句中或用于聚合函数中
但是这种语法是允许的..
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT 1 -- This changed from the first query
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) …Run Code Online (Sandbox Code Playgroud) 什么是用于动态 sql 生成的安全引用标识符的 SQL Server 方法。
quote_identifierquote_ident我如何确保为动态生成的语句提供动态生成的列名,该列本身不是 SQL 注入攻击。
假设我有一个 SQL 语句,
SELECT [$col] FROM table;
Run Code Online (Sandbox Code Playgroud)
本质上与
'SELECT [' + $col + '] FROM table;'
Run Code Online (Sandbox Code Playgroud)
什么可以阻止注入攻击
$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";
Run Code Online (Sandbox Code Playgroud)
导致
SELECT [$col] FROM table;
Run Code Online (Sandbox Code Playgroud) 我testtable在数据库testbase中创建了一个具有以下结构的表:
product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)
Run Code Online (Sandbox Code Playgroud)
但是,如何编写触发器,以便它更新已修改(或使用新信息更新)的特定行,并将修改日期记录到expire_date字段中,并将修改时间记录到expire_time字段中?(或者如果这是可能的?)
我已经看到大量查询来列出主键和外键,但是如何查询缺少主键的表?
PostgreSQL 中有一个旧的和不推荐使用的命令,它早于CREATE TABLE AS SELECT(CTAS)称为SELECT ... INTO .... FROM,它支持WITH子句/公共表表达式(CTE)。所以,例如,我可以做到这一点..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
SELECT *
INTO foo
FROM w;
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
CREATE TABLE foo AS
SELECT * FROM w;
Run Code Online (Sandbox Code Playgroud)
或者,我得到
ERROR: syntax error at or near "CREATE"
LINE 5: CREATE TABLE foo AS
Run Code Online (Sandbox Code Playgroud)
我将如何使用标准化的 CTAS 语法来做到这一点。
有一张这样的表:
CREATE TABLE aggregated_master (
"user" BIGINT,
type TEXT,
date TIMESTAMP,
operations BIGINT,
amount NUMERIC,
PRIMARY KEY ( "user", type, date )
);
Run Code Online (Sandbox Code Playgroud)
这张表是很多分区继承的主表。分区由 DATE 字段中的 MONTH 完成。例如:2017 年 8 月的分区将是 agg_201708,它的 PK 将是 pk_agg_201708 在插入之前通常会触发将插入重定向到正确的分区。
问题是我想在这个表中做一个 UPSERT。DO CONFLICT 部分不起作用。
最初的代码是这样的
INSERT INTO aggregated_master (user, type, date, oeprations, amount)
SELECT user, type, date, SUM(ops), SUM(amt)
FROM ...
WHERE ...
GROUP BY USER, TYPE, DATE
ON CONFLICT ON CONSTRAINT pk_aggregated
DO UPDATE SET operations = EXCLUDED.operations
, amount = EXCLUDED.amount
Run Code Online (Sandbox Code Playgroud)
但是后来我注意到约束 …
这是我今天尝试使用以下命令登录到我的 localhost PosgreSQL 数据库时收到的错误消息psql:
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Run Code Online (Sandbox Code Playgroud)
我使用 Homebrew 安装了 PostgreSQL,今天早上我使用该实用程序卸载并重新安装了 PostgreSQL,没有观察到任何变化。该psql客户端工作正常,我仍然可以使用它来连接到网络上的数据库。我一两个月只连接到我的本地数据库一次,之前它运行良好,所以我假设这是由于一些自动更新,但我不知道是哪个。Mac OS 最近将自身升级到 High Sierra (10.13)。
2014 年这里出现了相同的错误消息(链接),但这是一个人在启动服务器时遇到问题的情况。就我而言,我相信它正在运行——我已经使用过brew services start postgresql,是的,我今天重新启动了几次。但是,错误中提到的文件 ,/tmp/.s.PGSQL.5432在我的系统上不存在。我认为这是一些配置错误的情况。任何人都知道如何解决?
更新:我尝试手动启动服务器(按照 Evan 的建议),我认为我取得了突破。这是我尝试手动启动时遇到的错误:
FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 9.6, which is not compatible with this …Run Code Online (Sandbox Code Playgroud) 我正在查看 PostgreSQL 文档,其中:
REFRESH MATERIALIZED VIEW 完全取代了物化视图的内容。旧内容被丢弃。
但是,从 9.5 开始,我相信有一种方法可以更新 MV,而无需重新生成所有数据。
postgresql ×7
sql-server ×2
sql-standard ×2
ctas ×1
cte ×1
exists ×1
group-by ×1
mac-os-x ×1
pgadmin-3 ×1
plpgsql ×1
primary-key ×1
psql ×1
record ×1
security ×1
syntax ×1
trigger ×1
upsert ×1
windows ×1