我们正在构建具有空间数据组件的 Web 应用程序。开始时,我们的空间数据比较将采用给定点并返回匹配的重叠空间多边形。
话虽如此,我们的数据库还有许多其他组件,其中包括您在一般关系数据库中会发现的所有典型内容。
在我们的项目中,我们必须选择要使用的数据库解决方案。
所有项目成员都更熟悉 MySQL 的实现和管理,但所有研究都表明 PostgreSQL 是更好的解决方案 - 特别是在使用 postGIS 的空间数据方面。
我们期望(希望)我们的应用程序将体验大量并发用户的大量操作。
有使用 MySQL 作为空间数据组件的 RDBMS 的经验的任何人有任何长期的建议/经验吗?
除了熟悉之外,使用 PostGIS 是否有任何缺点?
我有一个 Postgresql 8.1 数据库。在一张表中,有三列:first_name、last_name、display_name。
是否可以将 的默认值设置display_name为first_name + " " + last_name?
我使用以下语句尝试了 aes-encryption:
SELECT encrypt('test', 'key', 'aes');
Run Code Online (Sandbox Code Playgroud)
这有效,但我无法解密该值。我将它插入到数据类型bytea的字段中,但我不确定这是否正确。
SELECT decrypt(pw, 'key', 'aes') FROM table WHERE ID = 1;
Run Code Online (Sandbox Code Playgroud)
给我错误
错误:函数解密(bytea,未知,未知)不存在第
1 行:选择解密(密码,'key','aes')FROM tabelle WHERE ID = 7; ^
提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
这是否真的意味着 encrypt() 是一个现有的函数,但不是decrypt()?我还能如何检索 aes 加密的值?
我已经按照以下方式donor在架构中创建了表reference:
CREATE TABLE reference.donor (
donor_code smallint PRIMARY KEY,
donor_name character varying NOT NULL,
donor_type smallint REFERENCES reference.donor_type (type_id),
alpha_2_code char(2) REFERENCES reference.iso_3166_1 (alpha_2_code)
);
Run Code Online (Sandbox Code Playgroud)
我已经按照以下方式填充了表格:
INSERT INTO reference.donor (donor_code, donor_name, donor_type, alpha_2_code)
SELECT donor_code, donor_name, donor_type, alpha_2_code
FROM reference.donor_template;
Run Code Online (Sandbox Code Playgroud)
当我运行时:
\dt+ reference.*
Run Code Online (Sandbox Code Playgroud)
在 psql 我看到reference.donor表:
List of relations
Schema | Name | Type | Owner | Size | Description
-----------+----------------+-------+----------+-------+-------------
reference | donor | table | postgres | 16 kB |
reference | …Run Code Online (Sandbox Code Playgroud) 在 Postgres 9.5 中,我很惊讶地看到在尝试 year 0001(没有 year zero 0000)时看到的结果。
-07:52:58?一些示例代码。请注意,我混合使用了TIMESTAMP WITH TIME ZONE和TIMESTAMP WITHOUT TIME ZONE,所以请仔细阅读。
SET TIME ZONE 'America/Los_Angeles' ;
SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',
TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z',
TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;
("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")
Run Code Online (Sandbox Code Playgroud)
我对第二个值感到惊讶:0001-12-31 16:07:02-07:52:58 BC. 我知道我们必须America/Los_Angeles在 UTC后八小时后退八小时,偏移量为-08:00. 但不是-08:00偏移量是-07:52:58. 为什么?
在 UTC 下输入数据时没有这样的问题。
SET TIME ZONE 'UTC' …Run Code Online (Sandbox Code Playgroud) 我有一个包含很多模式的数据库,我想将每个表内容转储到 CSV。我知道 COPY 命令,但我不确定如何编写一些脚本来读取模式中的所有表并针对它们执行 COPY。
只是希望证实我的观察并得到有关为什么会发生这种情况的解释。
我有一个函数定义为:
CREATE OR REPLACE FUNCTION "public"."__post_users_id_coin" ("coins" integer, "userid" integer) RETURNS TABLE (id integer) AS '
UPDATE
users
SET
coin = coin + coins
WHERE
userid = users.id
RETURNING
users.id' LANGUAGE "sql" COST 100 ROWS 1000
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
Run Code Online (Sandbox Code Playgroud)
当我从 CTE 调用此函数时,它执行 SQL 命令但不触发该函数,例如:
WITH test AS
(SELECT * FROM __post_users_id_coin(10, 1))
SELECT
1 -- Select 1 but update not performed
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我从 CTE 调用该函数,然后选择 CTE 的结果(或在没有 CTE 的情况下直接调用该函数),它将执行 SQL 命令并触发该函数,例如: …
执行这个请求:
update table t1 set t1.column = 0 where t1.column2 = 1234
Run Code Online (Sandbox Code Playgroud)
收到此错误:
关系“表”的“t1”列不存在
这个请求在 MySQL 中运行良好。
为什么我会在 PostgreSQL 中收到此错误?
我刚刚查看了一些为8.4 之前的 PostgreSQL编写的旧代码,我看到了一些非常棒的东西。我记得以前有一个自定义函数可以做一些这样的事情,但我忘记了预先的array_agg()样子。回顾一下,现代聚合是这样写的。
SELECT array_agg(x ORDER BY x DESC) FROM foobar;
Run Code Online (Sandbox Code Playgroud)
然而,曾几何时,它是这样写的,
SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC);
Run Code Online (Sandbox Code Playgroud)
所以,我用一些测试数据试了一下..
CREATE TEMP TABLE foobar AS
SELECT * FROM generate_series(1,1e7)
AS t(x);
Run Code Online (Sandbox Code Playgroud)
结果令人惊讶..#OldSchoolCool 方式要快得多:加速了 25%。此外,在没有ORDER 的情况下简化它,表现出同样的缓慢。
# EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar);
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Result (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Seq Scan on foobar (cost=0.00..104425.28 rows=6017728 width=32) (actual time=0.032..716.793 rows=10000000 loops=1) …Run Code Online (Sandbox Code Playgroud) 查看用于 alter table 的 postgres 文档,似乎可以将常规约束标记为DEFERRABLE(更具体地说,INITIALLY DEFERRED,这是我感兴趣的)。
索引也可以与约束相关联,只要:
索引不能有表达式列,也不能是部分索引
这让我相信目前没有办法拥有一个具有条件的唯一索引,例如:
CREATE UNIQUE INDEX unique_booking
ON public.booking
USING btree
(check_in, check_out)
WHERE booking_status = 1;
Run Code Online (Sandbox Code Playgroud)
是INITIALLY DEFERRED,意思是,唯一性“约束”只会在交易结束时进行验证(如果SET CONSTRAINTS ALL DEFERRED;使用)。
我的假设是否正确,如果正确,有什么方法可以实现预期的行为?
谢谢