执行SQL脚本遇unterminated quoted string等错误,寻求技术协助
解决PostgreSQL执行脚本时的单引号及语法错误问题
嘿,我来帮你搞定这个问题!你遇到的报错其实是两个问题叠加导致的:一是执行脚本的命令里单引号没正确转义,二是SQL脚本本身也存在语法错误。咱们一步步来解决:
一、修复执行命令的问题
你用的命令 \i c:/users/public/giro_d'italia2014.sql 里,路径中的单引号 ' 被psql当成了字符串的起始标记,但后面没有匹配的结束单引号,所以触发了 unterminated quoted string 和 \i: missing required argument 错误。
解决方法有两种,选一种就行:
- 方法1:用双引号把整个路径包裹起来:
\i "c:/users/public/giro_d'italia2014.sql" - 方法2:把路径里的单引号转义成两个连续的单引号(PostgreSQL里用两个单引号表示一个字面单引号):
\i c:/users/public/giro_d''italia2014.sql
二、修复SQL脚本的语法错误
即使命令改对了,你的原始脚本也跑不通,因为有几个明显的语法问题,我已经帮你修正并标注了修改点:
修正后的完整脚本
-- 1. 用双引号包裹带单引号的schema名,避免标识符解析错误 DROP SCHEMA IF EXISTS "giro_d'italia2014" CASCADE; CREATE SCHEMA "giro_d'italia2014"; SET search_path TO "giro_d'italia2014"; -- 2. 修正列名:把"nome ciclista"改为规范的下划线命名(如果坚持用空格,写成"nome ciclista"也可以) CREATE TABLE ciclista( id_ciclista INTEGER PRIMARY KEY, nome_ciclista VARCHAR, squadra CHAR(3), nazione CHAR(3) ); -- 3. 创建枚举类型替代原脚本中不合法的集合写法,限制tipologia列的可选值 CREATE TYPE tipologia_tappa AS ENUM ( 'pianeggiante', 'alta montagna', 'media montagna', 'cronometro a squadre', 'cronometro individuale', 'cronoscalata' ); CREATE TABLE tappa( nome_tappa VARCHAR PRIMARY KEY, km INT, tipologia tipologia_tappa ); -- 4. 可选但推荐:添加外键约束,确保数据关联的完整性 CREATE TABLE ordine_arrivo( id_ciclista INT, nome_tappa VARCHAR, ordine INT, PRIMARY KEY (id_ciclista, nome_tappa), FOREIGN KEY (id_ciclista) REFERENCES ciclista(id_ciclista), FOREIGN KEY (nome_tappa) REFERENCES tappa(nome_tappa) );
关键修改说明
- 带特殊字符的标识符:PostgreSQL中如果标识符(比如schema名、列名)包含单引号、空格等特殊字符,必须用双引号包裹,否则会被解析成语法错误;
- 列名错误:原脚本里的
nome ciclista是无效列名(除非用双引号包裹),改成nome_ciclista更符合SQL命名规范; - 自定义类型:原脚本中
tipologia列的集合写法{'xxx'|'xxx'}不是PostgreSQL支持的语法,用枚举类型(ENUM)可以完美实现“限制列值只能是指定选项”的需求; - 外键约束:给
ordine_arrivo表添加外键,确保只能插入存在的车手和赛段数据,避免无效数据。
按照上面的步骤修改后,再执行脚本应该就能正常运行了!
内容的提问来源于stack exchange,提问作者Pieropol
相关产品推荐
相关产品推荐

