gpt4 book ai didi

未找到 PostgreSQL 关系,返回小写

转载 作者:行者123 更新时间:2023-11-29 13:00:19 25 4
gpt4 key购买 nike

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

如果我尝试

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

我收到错误:错误:关系“map_hvi_to_platform”不存在注意它返回“ map ”而不是“ map ”

如果我尝试

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

我收到错误:错误:列“Map_hvi_to_platform”不存在

但是如果我运行 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 有点陌生。

最佳答案

从长远来看,使用带引号的标识符会给您带来更多的麻烦,而不是它们的实际值(value)(这首先是值得商榷的)。

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

字符串文字 'Map_hvi_to_platform' 可以 自动转换为 regclass,但在那种情况下(可怕的)引用标识符的通常规则适用,Postgres 寻找一个表名 map_hvi_to_platform

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

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

但是一旦你获得正确的 regclass 值,你就会得到下一个错误,因为 '' 不是时间戳值的有效常量。如果您不想为此提供值,则需要使用 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);

(注意 "EndDate"null 值)


我不得不承认,我无法想象将表名存储在另一个表中是有意义的情况。这确实有点像破损的设计

关于未找到 PostgreSQL 关系,返回小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32374385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com