标签: postgresql

PostgreSQL - 如何重命名 CamelCase 列?

当我尝试像这样重命名 CamelCase 列时:

ALTER TABLE mytable RENAME COLUMN camelCaseColumn TO camel_case_column;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR: column "camelcasecolumn" does not exist
Run Code Online (Sandbox Code Playgroud)

用单引号将 CamelCase 列名称括起来,如下所示:

ALTER TABLE mytable RENAME COLUMN 'camelCaseColumn' TO camel_case_column;
Run Code Online (Sandbox Code Playgroud)

给我一个语法错误。

有什么办法可以重命名该列吗?或者我必须创建一个新表并传输数据?

数据库在 Ubuntu 上运行,我使用 Mac OS X ssh 到运行数据库的服务器以发出命令ALTER TABLE。我知道 Mac OS X 不区分大小写,所以这可能是问题的一部分吗?

谢谢!

postgresql alter-table

5
推荐指数
1
解决办法
1万
查看次数

限制在边界上的不重叠矩形

我正在尝试对电路板上零件的放置进行建模。没有任何有意义的限制,我的基本架构如下所示:

create table part (
    part_id bigserial primary key,
    name text not null,
    width double precision not null,
    height double precision not null
);
create table board (
    board_id bigserial primary key,
    width double precision not null,
    height double precision not null
);
create table board_part (
    board_id bigint not null references board,
    part_id bigint not null references part,
    position point not null
);
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle可视化

对于bb2any board_parts,我想强制执行以下约束:

  1. b位于黑板上:

    box(b.position, …
    Run Code Online (Sandbox Code Playgroud)

postgresql database-design referential-integrity spatial exclusion-constraint

5
推荐指数
1
解决办法
529
查看次数

安全的 postgresql 数据库加密

根据这个 答案,不可能使用 pgcrypto 进行完全安全的数据库加密。

现在,两年后(在 postgresql 9.3 中)是否有任何新的扩展或新方法来进行安全的数据库加密,或者在应用程序服务器上执行此操作仍然是确保具有数据库访问权限的人无法解密数据的唯一方法?

postgresql security encryption

5
推荐指数
1
解决办法
6479
查看次数

使用多个关联更新 SQL n:n 表

我以前曾经这样做过,但在我盲目地重复一些我认为是黑客的事情之前,我在这里问一下。

我有 3 个表(为了清楚起见,省略了详细信息):

库存项目

id bigserial (PK)
sku character varying(24)
name character varying(32)
...
Run Code Online (Sandbox Code Playgroud)

inv_item_groups

id bigserial (PK)
name cahracter varying(32)
...
Run Code Online (Sandbox Code Playgroud)

inv_item_group_members

item_group_id bigint (FK -> inv_item_groups)
item_id bigint (FK -> inv_items)
Run Code Online (Sandbox Code Playgroud)

现在,在我的代码中,我有一个像这样的对象(以伪代码形式)

class ItemGroup
   id:long
   groupName:String
   items:long[]
Run Code Online (Sandbox Code Playgroud)

并且这些对象是可以修改的,然后需要更新。由于我想保留密钥完整性,因此我需要该inv_item_group_members表(否则,我会使用其他解决方案)。

现在,我通常的做法是

DELETE FROM inv_item_group_members WHERE item_group_id = $1
-- where $1 is the object's id
Run Code Online (Sandbox Code Playgroud)

的,对于items对象中的每个

INSERT INTO inv_item_group_members (item_group_id, item_id) VALUES ($1, $2)
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?有哪些替代方案?我正在考虑一个 SQL 函数,但不太确定这里最好的方法是什么(我对 PGSQL 还不太有经验。)我已经阅读过有关可写 CTE 的内容,但它没有解决从其中删除元素时的情况数组(即删除关联)。

postgresql

5
推荐指数
1
解决办法
543
查看次数

如何将bytea_output设置为十六进制?

我似乎无法bytea_output改变hex

我尝试过这个方法

ALTER DATABASE dbname SET bytea_output TO 'hex';
Run Code Online (Sandbox Code Playgroud)

我尝试编辑 postgresql.conf

bytea_output = 'hex'
Run Code Online (Sandbox Code Playgroud)

并重新启动服务器。

我努力了

SET bytea_output = 'hex'
Run Code Online (Sandbox Code Playgroud)

它适用于每笔交易,但这非常乏味。

然而,每当我在 phpPgAdmin 中浏览我的 bytea 列时,这些列都会被转义输出。

SELECT setting FROM pg_settings WHERE name = 'bytea_output'
Run Code Online (Sandbox Code Playgroud)

返回escape

如何才能bytea_output永久设置为hex

postgresql configuration phppgadmin

5
推荐指数
1
解决办法
1万
查看次数

pg_dump 命令的 --column-insert 和 --attribute-insert 之间的区别

背景:

我正在尝试创建一个仅包含数据库中的数据的转储文件。我希望它使用 INSERT 命令创建数据。在阅读手册时,(http://www.postgresql.org/docs/9.2/static/app-pgdump.html#PG-DUMP-EXAMPLES)我发现我可以使用

  • --列插入
  • --属性插入

从手册中并不清楚有什么区别。所以我尝试了两者并对文件进行了比较。存在差异,我想知道为什么。有人能告诉我这两个命令有什么区别吗?

这是我正在运行的完整命令:

pg_dump -a --column-inserts -U postgres testdb > /tmp/test_data_as_inserts2.sql
Run Code Online (Sandbox Code Playgroud)

和 :

 pg_dump -a --attribute-inserts -U postgres testdb > /tmp/test_data_as_inserts.sql
Run Code Online (Sandbox Code Playgroud)

任何提示将不胜感激。与此同时,我将深入研究这两个文件之间的区别……为什么某些记录被包含而另一些则不被包含。

谢谢。

postgresql backup

5
推荐指数
1
解决办法
1万
查看次数

如何优化多个ORDER BY?

我在一个大约有 300,000 行且每列都有 B 树的表上遇到了缓慢的性能。

这适用于动态分页页面,其中查询是按需构建的,并且应用程序按照查询的指定顺序缓存主键。

对于此查询

explain analyze 
 SELECT supplier_management.buyer_purchase_order_id 
     FROM supplier_management 
     ORDER BY item_description DESC,
      item_number DESC,
      order_type ASC,
      possession_date DESC,
      shipment_type DESC,
      store_type DESC
Run Code Online (Sandbox Code Playgroud)

我得到这些结果:

排序(成本=51026.98..51750.35行=289348宽度=72)(实际时间=8229.280..12349.596行=289348循环=1)

排序键:商品描述、商品编号、订单类型、拥有日期、发货类型、商店类型

排序方式:外部合并磁盘:24744kB

-> 供应商管理上的顺序扫描(成本=0.00..10876.48行=289348宽度=72)(实际时间=0.015..187.426行=289348循环=1)

总运行时间:12407.064 毫秒

如何提高多列排序的性能?或者我应该用 C++ 来做?

表结构

buyer_purchase_order_id bigint
supplier_number bigint
supplier_name   character varying
purchase_order_number   bigint
store_number    integer
item_number bigint
item_description    character varying
project_type    character varying
order_date  integer
requested_arrival_date  integer
department  character varying
store_type  character varying
shipment_type   character varying
order_type  character varying
quantity_ordered    integer
quantity_allocation integer
quantity_staged integer …
Run Code Online (Sandbox Code Playgroud)

postgresql optimization order-by

5
推荐指数
1
解决办法
9092
查看次数

更改 postgres 副本到导出文件的权限

我已经在 SO 上问过这个问题,但也许那是错误的位置。对于重复发帖表示歉意,但这个问题可能在这里有更好的受众。

原来的问题是:/sf/ask/1793350331/

正文如下。谢谢。


当运行 postgresql [9.3]“COPY TO”功能时,postgres 用户创建一个文件。我已经告诉它把文件放在 tmp 目录中(尽管如果需要的话可以更改)。

这是作为 cron 作业的一部分运行的,用户是专门为此任务设置的“导出”用户。最终目标是导出的文件最终位于 /home/export/created_file.csv 中。

1)postgres如果不将文件夹设置得过于宽松,则无法将导出的文件直接存储到另一个用户的主目录中。

2) 导出用户可以将文件从其/tmp主目录复制到其主目录,但随后无法清理(删除)postgres中拥有的文件/tmp

这是一个日常过程,因此需要以某种方式删除旧文件。我可以添加一个 cron 作业来清理文件,但我希望有一个更干净的解决方案 - 要么是一种更改创建文件的权限的方法postgres,要么是某种方式为导出用户提供能够删除的额外权限该文件在创建之前。

然而,为导出用户提供与postgres一般情况相同的权限并不是一种选择,因为这样它将可以自由控制数据库。

任何建议,无论是基于 unix 还是基于 postgres,都将非常受欢迎,谢谢。

postgresql linux export copy

5
推荐指数
1
解决办法
2万
查看次数

postgresql 中的转义分隔符

我正在尝试将数据导入到 postgres 中。数据字段以逗号分隔,字符串可能包含逗号,在这种情况下,这些字段将被转义:

数据结构:

create table v (a varchar);
Run Code Online (Sandbox Code Playgroud)

数据文件:

bus
'Gat\,\\e\'way_MQB'
Run Code Online (Sandbox Code Playgroud)

导入命令(在Linux下从bash运行)

cat data.csv | psql -d database -c "copy v (a) from stdin with delimiter ',' escape '\\' CSV header"
Run Code Online (Sandbox Code Playgroud)

错误:

ERROR:  extra data after last expected column
Run Code Online (Sandbox Code Playgroud)

我已经和谷歌对抗这个问题好几个小时了,不明白我做错了什么?

postgresql import copy

5
推荐指数
1
解决办法
2万
查看次数

使用变量来确定 Postgres 中 select 中的列名

我正在尝试从旧表创建新表结构的更新,但不使用函数。我正在尝试为其创建一个脚本。旧表是这样的:

旧表 ( OldTable)

姓名 可乐 列b 列_c
ABC 0 无效的 1
DEF 1 1 1
生长激素指数 无效的 1 0

并且,新表:

Users:

ID 姓名
1 ABC
2 DEF
3 生长激素指数

Rules:

ID 规则名称
1 可乐
2 列b
3 列_c
4 寒冷的

UserRule

ID_USER ID_规则

因此,我需要使用 TableMix 上的选择结果填充表 UserRules,其中用户名等于表 User 上的用户名,并且 TableMix 中列 <col_name> 的值等于 1。(select <col_name>来自 OldTable,其中 OldTable.name = Users.name)。嗯,我正在尝试这个:

DO $$
    DECLARE rules CURSOR FOR SELECT column_name FROM information_schema.columns
        WHERE table_schema = 'public' AND table_name   = …
Run Code Online (Sandbox Code Playgroud)

postgresql scripting dynamic-sql select

5
推荐指数
1
解决办法
2万
查看次数