我正在尝试将一些值插入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的新手。
答案 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
我做了一个简单的测试用例并且有效。