You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

psql执行脚本未创建表,pgAdmin查询工具执行却正常的问题咨询

PostgreSQL脚本执行无报错但pgAdmin看不到表的问题

问题现象

  • 通过Windows控制台执行数据库脚本,全程无报错,但在pgAdmin中找不到预期创建的表
  • 将脚本内容复制到pgAdmin的Query Tool中执行,却能正常创建表并查看数据

脚本内容

DROP DATABASE IF EXISTS test01 WITH (FORCE); -- 强制删除正在使用的数据库

CREATE DATABASE test01
    WITH
    OWNER = postgres
    ENCODING = 'UTF8'
    LC_COLLATE = 'German_Germany.1252'
    LC_CTYPE = 'German_Germany.1252'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1
    IS_TEMPLATE = False
    ;

CREATE TABLE customers
(
   customer_id INT GENERATED ALWAYS AS IDENTITY,
   customer_name VARCHAR(255) NOT NULL,
   PRIMARY KEY(customer_id)
);

CREATE TABLE contacts
(
   contact_id INT GENERATED ALWAYS AS IDENTITY,
   customer_id INT,
   contact_name VARCHAR(255) NOT NULL,
   phone VARCHAR(15),
   email VARCHAR(100),
   PRIMARY KEY(contact_id),
    CONSTRAINT fk_customer
      FOREIGN KEY(customer_id) 
      REFERENCES customers(customer_id)
      ON DELETE CASCADE 
);

INSERT INTO customers(customer_name)
VALUES('BlueBird Inc'),
      ('Dolphin LLC');     
   
INSERT INTO contacts(customer_id, contact_name, phone, email)
VALUES(1,'John Doe','(408)-111-1234','john.doe@bluebird.dev'),
      (1,'Jane Doe','(408)-111-1235','jane.doe@bluebird.dev'),
      (2,'David Wright','(408)-222-1234','david.wright@dolphin.dev'); 

执行命令

通过Windows控制台执行脚本的命令:

"C:\Program Files\PostgreSQL\15\bin\psql.exe" -U postgres -f "C:\Users\my user name\Desktop\db_create.sql" postgres

问题原因与解决

核心原因

脚本创建test01数据库后,后续的建表、插入语句仍在初始连接的postgres数据库中执行,而非新创建的test01库。你在pgAdmin中查看的是test01库,自然看不到实际创建在postgres库中的表。

而在pgAdmin的Query Tool中执行时,你大概率是手动切换到了test01库后执行的建表语句,所以能正常看到结果。

解决方法

在脚本的CREATE DATABASE语句之后,添加psql的元命令\c test01,用于切换到新创建的数据库。修改后的脚本如下:

DROP DATABASE IF EXISTS test01 WITH (FORCE); -- 强制删除正在使用的数据库

CREATE DATABASE test01
    WITH
    OWNER = postgres
    ENCODING = 'UTF8'
    LC_COLLATE = 'German_Germany.1252'
    LC_CTYPE = 'German_Germany.1252'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1
    IS_TEMPLATE = False
    ;

-- 切换到新创建的test01数据库
\c test01

CREATE TABLE customers
(
   customer_id INT GENERATED ALWAYS AS IDENTITY,
   customer_name VARCHAR(255) NOT NULL,
   PRIMARY KEY(customer_id)
);

CREATE TABLE contacts
(
   contact_id INT GENERATED ALWAYS AS IDENTITY,
   customer_id INT,
   contact_name VARCHAR(255) NOT NULL,
   phone VARCHAR(15),
   email VARCHAR(100),
   PRIMARY KEY(contact_id),
    CONSTRAINT fk_customer
      FOREIGN KEY(customer_id) 
      REFERENCES customers(customer_id)
      ON DELETE CASCADE 
);

INSERT INTO customers(customer_name)
VALUES('BlueBird Inc'),
      ('Dolphin LLC');     
   
INSERT INTO contacts(customer_id, contact_name, phone, email)
VALUES(1,'John Doe','(408)-111-1234','john.doe@bluebird.dev'),
      (1,'Jane Doe','(408)-111-1235','jane.doe@bluebird.dev'),
      (2,'David Wright','(408)-222-1234','david.wright@dolphin.dev'); 

再次通过控制台执行修改后的脚本,表就会正确创建在test01数据库中,pgAdmin也能正常看到。

内容的提问来源于stack exchange,提问作者Paul Efford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:56:10