是否可以有一个外键指向系统目录(pg_catalog)表的字段?
当我尝试以下操作时:
ALTER TABLE my_table ADD CONSTRAINT fk_my_table FOREIGN KEY (role_name) REFERENCES pg_roles(rolname) ON UPDATE CASCADE;
Run Code Online (Sandbox Code Playgroud)
我得到:
ERROR: referenced relation "pg_roles" is not a table
Run Code Online (Sandbox Code Playgroud) 有没有办法执行 pg_dump 并排除表/视图和列的 COMMENT ON ?
我广泛使用 COMMENT ON 命令来描述所有对象,并且经常在其中包含换行符以获得更清晰的描述,例如:
COMMENT ON TABLE mytable1 IS 'MAIN TABLE...
NOTES:
1. ...
2. ...
3. ...
';
Run Code Online (Sandbox Code Playgroud)
但是,由于转储中也有换行符,我不能简单地使用 grep -v 'COMMENT ON' 命令删除注释。
还有其他方法可以从转储中快速删除这些 COMMENT ON 吗?
与pg_dump 一样没有对对象的评论?, 有没有人知道一个命令可以一次快速删除COMMENT ON所有对象上的注释(创建于)?
现在,我求助于 bash 生成一个 SQL 脚本,该脚本会一个一个地取消每个表/视图/列上的注释,但速度很慢,尤其是 > 4000 列。
例子:
COMMENT ON COLUMN table1.column1 IS NULL;
COMMENT ON COLUMN table1.column2 IS NULL;
COMMENT ON COLUMN table1.column3 IS NULL;
...
Run Code Online (Sandbox Code Playgroud) The following regex simply extracts a part of the matched text using the backreferencing numbers:
SELECT regexp_replace('ABCDEFGHIJ','(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)','\2');
B
Run Code Online (Sandbox Code Playgroud)
But how to backreference beyond the ninth matched substring?
The following won't work (returns the first match + 0), neither will the use of $10 or ${10}:
SELECT regexp_replace('ABCDEFGHIJ','(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)','\10')
A0
Run Code Online (Sandbox Code Playgroud)
Note: this example was simplified for clarity, and would of course not necessitate going beyond backreference 9.
我使用awk gsub替换制表符分隔文件的特定列中的字符串:
cat test.txt
1 1 2032 1
2 1 2032 2
3 1 999 3
4 1 2032 4
5 1 9999 5
Run Code Online (Sandbox Code Playgroud)
但是,即使指定了-F“ \ t”,修改后的行也由空格分隔:
awk -F "\t" '{gsub(/^999$/,"XXX",$3);print}' test.txt
1 1 2032 1
2 1 2032 2
3 1 XXX 3
4 1 2032 4
5 1 9999 5
Run Code Online (Sandbox Code Playgroud)
如何将修改后的行也用制表符分隔?
有没有办法按年龄或日期而不是硬编码名称指定文件来使用pg_archivecleanup命令清理WAL档案?
例如,使用以下命令非常简单:
pg_archivecleanup "C:\Program Files\PostgreSQL\9.2\data\pg_xlog" 000000010000004600000045
Run Code Online (Sandbox Code Playgroud)
其中000000010000004600000045是文件名,之前创建的任何文件都将被删除.
但是,如果我想自动化该过程,必须有一种方法来按年龄/日期选择文件.
在Windows 7,PostgreSQL 9.3.2下,我试图在同一服务器上使用不同的端口号和数据目录将PostgreSQL的第二个实例注册为服务.使用initdb命令在C:\ Program Files\PostgreSQL\9.3\data2下成功创建了第二个集群.
当我从C:\ Program Files\PostgreSQL\9.3\bin运行以下pg_ctl register命令时,收到一条错误消息:
pg_ctl register -N postgresql9.2_2nd_cluster -U "NT AUTHORITY\NetworkService" -D "C:\Program Files\PostgreSQL\9.3\data2" -S auto -o "-p 5431"
pg_ctl: could not open service manager
Run Code Online (Sandbox Code Playgroud)
我用Google搜索,但没有太大的成功.