Postgres案例敏感性

时间:2014-02-15 10:46:40

标签: sql sql-server postgresql

我已经从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,所以没有这样的问题。 有没有办法摆脱这个?请帮忙。

2 个答案:

答案 0 :(得分:52)

在PostgreSQL中,不带引号的名称不区分大小写。因此SELECT * FROM helloSELECT * FROM HELLO是等效的。

但是,引用的名称区分大小写。 SELECT * FROM "hello" 等同于SELECT * FROM "HELLO"

要在引用名称和不带引号的名称之间建立“桥梁”,不带引号的名称会隐式地小写,因此helloHELLOHeLLo等同于"hello",但不要"HELLO""HeLLo"(OOPS!)。

因此,在PostgreSQL中创建实体(表,视图,过程等)时,您应该指定它们不引用或引用但小写。


要转换现有的表/视图/等,您可以使用ALTER TABLE "FOO" RENAME TO "foo"

之类的内容

或者,尝试从MSSQL修改dump以使其“兼容PostgreSQL”(因此它将包含foo s或"foo" s但不包含"FOO" s。

  • 通过显式编辑转储文件。 (如果您使用的是Linux,则可以执行sed -r 's/"[^"]+"/\L\0/g' dumpfile - 但是请注意,此命令也可能会修改字符串文字中的文本。)
  • 或者从MSSQL获取转储时指定一些选项。 (我不确定MSSQL中是否有这样的选项,从未使用它,但可能存在这样的选项。)

答案 1 :(得分:0)

以上解决方案也适用于Debian Stretch上的pg_dump。最终发现它与您在psql命令行中的操作类似:

   pg_dump -d myDatabaseName -t \"myTableName\" > myDumped.sql

反斜杠后,它不能用单引号引起来,类似于在psql>提示符下不起作用。

相关问题