我已经从MSSql server 2008通过工具导入了Postgres中的100个表,该工具创建了所有表及其大写字母中的列。现在,如果我想从表中生成数据视图,例如 - STD_TYPE_CODES为 -
select * from STD_TYPE_CODES
我收到以下错误 -
ERROR: relation "std_type_codes" does not exist
LINE 1: select * from STD_TYPE_CODES
^
********** Error **********
ERROR: relation "std_type_codes" does not exist
SQL state: 42P01
Character: 15
我知道我可以将表名称引用为 -
select * from "STD_TYPE_CODES"
但是由于我使用过MSSql Server,所以没有这样的问题。 有没有办法摆脱这个?请帮忙。
答案 0 :(得分:52)
在PostgreSQL中,不带引号的名称不区分大小写。因此SELECT * FROM hello
和SELECT * FROM HELLO
是等效的。
但是,引用的名称区分大小写。 SELECT * FROM "hello"
等同于SELECT * FROM "HELLO"
。
要在引用名称和不带引号的名称之间建立“桥梁”,不带引号的名称会隐式地小写,因此hello
,HELLO
和HeLLo
等同于"hello"
,但不要"HELLO"
或"HeLLo"
(OOPS!)。
因此,在PostgreSQL中创建实体(表,视图,过程等)时,您应该指定它们不引用或引用但小写。
要转换现有的表/视图/等,您可以使用ALTER TABLE "FOO" RENAME TO "foo"
。
或者,尝试从MSSQL修改dump以使其“兼容PostgreSQL”(因此它将包含foo
s或"foo"
s但不包含"FOO"
s。
sed -r 's/"[^"]+"/\L\0/g' dumpfile
- 但是请注意,此命令也可能会修改字符串文字中的文本。)答案 1 :(得分:0)
以上解决方案也适用于Debian Stretch上的pg_dump。最终发现它与您在psql命令行中的操作类似:
pg_dump -d myDatabaseName -t \"myTableName\" > myDumped.sql
反斜杠后,它不能用单引号引起来,类似于在psql>提示符下不起作用。