未找到PostgreSQL关系,返回小写

时间:2015-09-03 11:27:59

标签: postgresql

我正在尝试将一些值插入PostgreSQL数据库的表中。 应该很简单,但我总是在尝试运行命令时遇到错误

如果我尝试

INSERT INTO "Map" VALUES ('Map_hvi_to_platform', 'ULX_hvi', 276, 'ULX_platforms', 278, 'A', 'ccdadm', now(), '', 280);

我收到错误:ERROR: relation "map_hvi_to_platform" does not exist 请注意,它返回'map'而不是'Map'

如果我尝试

INSERT INTO "Map" VALUES ("Map_hvi_to_platform", 'ULX_hvi', 276, 'ULX_platforms', 278, 'A', 'ccdadm', now(), '', 280);

我收到错误:ERROR: column "Map_hvi_to_platform" does not exist

但如果我跑SELECT * FROM "Map_hvi_to_platform"; 它确实返回存储在该表中的所有值

这是CREATE TABLE(我没有写这个,我正在处理一个已经构建的数据库)

-- Table: "Map"

-- DROP TABLE "Map";

CREATE TABLE "Map"
(
  "IdDomain" regclass NOT NULL, -- MODE: reserved
  "IdClass1" regclass NOT NULL, -- MODE: reserved
  "IdObj1" integer NOT NULL, -- MODE: reserved
  "IdClass2" regclass NOT NULL, -- MODE: reserved
  "IdObj2" integer NOT NULL, -- MODE: reserved
  "Status" character(1), -- MODE: reserved
  "User" character varying(100), -- MODE: reserved
  "BeginDate" timestamp without time zone NOT NULL DEFAULT now(), -- MODE: reserved
  "EndDate" timestamp without time zone, -- MODE: reserved
  "Id" integer NOT NULL DEFAULT _cm_new_card_id(), -- MODE: reserved
  CONSTRAINT "Map_pkey" PRIMARY KEY ("IdDomain", "IdClass1", "IdObj1", "IdClass2", "IdObj2")
)
WITH (
  OIDS=FALSE
);

有没有办法克服这个问题?我是PostgreSQL的新手。

2 个答案:

答案 0 :(得分:2)

从长远来看,使用带引号的标识符会给你带来很多更多的麻烦(实际上值得争论)。

在您的情况下,您尝试插入regclass值。值"Map_hvi_to_platform"不起作用,因为insert语句将其视为列标识符。

字符串文字'Map_hvi_to_platform' 可以自动转换为regclass,但在这种情况下,(可怕的)引用标识符的通常规则适用,Postgres查找表名{{1 }}。

您实际上需要将两种引用样式组合在一起:

map_hvi_to_platform

但是一旦你得到了regclass值,你就会得到下一个错误,因为INSERT INTO "Map" VALUES ('"Map_hvi_to_platform"', '"ULX_hvi"', 276, '"ULX_platforms"', 278, 'A', 'ccdadm', now(), '', 280); 不是时间戳值的有效常量。如果您不想为此提供值,则需要使用''

通常,在null语句中不列出列名称被认为是错误的编码风格。明确列出它们有两个好处:其他人更容易理解哪个值进入哪个列,并且它对表结构的更改更加健壮。

所以最后的陈述应该是:

insert

(请注意INSERT INTO "Map" ("IdDomain", "IdClass1", "IdObj1", "IdClass2", "IdObj2", "Status", "User", "BeginDate", "EndDate", "Id") VALUES ('"Map_hvi_to_platform"', '"ULX_hvi"', 276, '"ULX_platforms"', 278, 'A', 'ccdadm', now(), null, 280); )的null

我必须承认,我无法想象将表名存储在另一个表中的情况。这确实有点像破碎的设计

答案 1 :(得分:0)

您遇到此问题是因为列类型是regclass,它允许postgres检查您是否正在插入现有表名的名称(我只是简单地说明了这一点)。问题是您的表(Map_hvi_to_platform)是使用“”创建的,因此您必须使用双引号引用它,即

Select * from "Map_hvi_to_platform"

为了使您的插入工作,您必须发出类似

的内容
INSERT INTO "Map" VALUES ('"Map_hvi_to_platform"', 'ULX_hvi', 276, 'ULX_platforms', 278, 'A', 'ccdadm', now(), '', 280);

即。您必须在单引号之间的名称中包含双引号;您必须使用的名称是“Map_hvi_to_platform”而不是Map_hvi_to_platform

我做了一个简单的测试用例并且有效。