PostgreSQL执行INSERT报错public.ae_User表username列不存在问题求助
报错原因
- PostgreSQL对标识符大小写有明确规则:未用双引号包裹的表名、列名等标识符,会被自动转换为小写处理;只有用双引号包裹的标识符才会严格保留大小写。
- 建表时你为所有列名添加了双引号,保留了
Username这类驼峰大小写形式,执行INSERT语句时列名Username未加双引号,被数据库自动转换为小写username,和实际存在的驼峰列名不匹配,因此触发字段不存在的报错。 - 除此之外你的语句还有两处隐藏问题:一是INSERT中字符串值使用了双引号包裹,PostgreSQL中双引号仅用于标识标识符,字符串值需要用单引号;二是建表时将表名写为
"public.ae_User",相当于把public.前缀直接作为表名的一部分,而非指定schema,后续引用时必须完整写为"public"."public.ae_User",命名不符合规范。
解决方案
方案1:直接修改INSERT语句适配已创建的表
将INSERT语句中的列名全部加双引号,同时将字符串值替换为单引号包裹即可正常执行:
INSERT INTO "public"."public.ae_User" ("Name", "Username", "Email", "Password", "Salt", "User_type", "Deleted") VALUES ('Miguel', 'adminMiguel', 'miguel@gmail.com', 'admin', 'bla', 3, false);
方案2(推荐):重建表使用规范命名
删除命名不规范的现有表,重新建表时去掉不必要的双引号,使用小写加下划线的命名方式,符合PostgreSQL使用最佳实践,可避免后续所有大小写相关的标识符问题:
-- 删除原有命名不规范的表 DROP TABLE IF EXISTS "public.ae_User"; -- 新建规范命名的用户表 CREATE TABLE public.ae_user ( id serial NOT NULL, name character varying(30) NOT NULL, username character varying(16) NOT NULL UNIQUE DEFAULT 'Guest', email character varying(30) NOT NULL, password character varying(120) NOT NULL, salt character varying(40) NOT NULL, user_type int NOT NULL DEFAULT 0, deleted BOOLEAN NOT NULL DEFAULT false, CONSTRAINT ae_user_pk PRIMARY KEY (id) ) WITH ( OIDS=FALSE );
后续插入数据直接执行以下语句即可,不需要额外添加双引号:
INSERT INTO public.ae_user (name, username, email, password, salt, user_type, deleted) VALUES ('Miguel', 'adminMiguel', 'miguel@gmail.com', 'admin', 'bla', 3, false);
内容的提问来源于stack exchange,提问作者Codigo de Senior
相关产品推荐
相关产品推荐

