【问题标题】:How do I create a postrgresql database using SQL's DDL on pgadmin4?如何在 pgadmin 4 中使用 SQL DDL 创建 postgresql 数据库?
【发布时间】:2019-09-06 09:39:24
【问题描述】:

我正在学习 DDL 以使用 Postgresql 10 创建和定义 SQL 数据库。 我在.sql 文件中有类似以下 SQL 代码的内容,我想在 psql 或 PgAdmin 4 中输入它,只是为了测试语法并查看数据库结构:

CREATE DATABASE database;

CREATE TYPE t_name AS 
(      first    VARCHAR(30),
       last     VARCHAR(60) 
);

CREATE TABLE telephone_m 
(   tnumber  VARCHAR(15) NOT NULL UNIQUE
);

CREATE TABLE people 
(   curp        CHAR(18)    NOT NULL PRIMARY KEY,
    pname       t_name      NOT NULL,
    birth_date  DATE        NOT NULL,
    telephone_m VARCHAR(15) REFERENCES telephone_m
);

CREATE TABLE clients
(   curp        CHAR(18)    NOT NULL PRIMARY KEY,
    cid         SERIAL      NOT NULL REFERENCES cards,  
    clocation   VARCHAR(29)
)   INHERITS (people);

CREATE TABLE cards
(   cid         BIGSERIAL   NOT NULL PRIMARY KEY,
    curp        CHAR(18)    NOT NULL REFERENCES clients,
    trips       SMALLINT,
    distance    NUMERIC, 
    points      NUMERIC
);

CREATE TABLE drivers
(   curp        CHAR(18)    NOT NULL PRIMARY KEY,
    rfc         CHAR(22)    NOT NULL UNIQUE,
    adress      t_adress    NOT NULL
)   INHERITS (people);

我尝试在 PgAdmin 4 中右键单击一个新数据库 -> 创建脚本,它会打开查询编辑器,我复制粘贴我的代码并执行它,但它返回:

ERROR:  CREATE DATABASE cannot be executed from a function or multi-command string
SQL state: 25001

我也尝试过直接从 PgAdmin 工具菜单中使用查询工具,结果相同。

【问题讨论】:

  • Erwin 在他的回答中得到了正确的答案,但我还要指出您正在创建一个数据库(命名不佳的数据库),但您正在创建的所有表都不在该数据库中。创建后,您需要连接到它。

标签: sql postgresql ddl pgadmin-4


【解决方案1】:

数据库创建得很好。但是如果你想在新数据库中创建对象,你必须连接到它。在任何客户端,包括pgAdmin4。

您不能在事务中运行CREATE DATABASE。必须自己承担。一次执行多个命令会自动包装到 pgAdmin 中的单个事务中。

您必须自己执行CREATE DATABASE mydb;(例如,仅选择该行并在连接到任何数据库时按F5,甚至是维护数据库“ postgres”。然后在pgadmin4主窗口/选项卡的对象浏览器中点击“Databases”,点击F5刷新视图,点击新DB,打开带有 flash 图标的新查询工具(在新窗口/选项卡中)并在那里执行脚本的其余部分。

psql 脚本通过使用元命令 \c 在同一会话中创建新数据库后连接到它进行管理。

旁白:

“数据库”不是数据库的好名字。

CREATE TYPE AS (...),但只是CREATE TABLE (...)。没有AS

而且您通常不想使用数据类型CHAR(18)。见:

【讨论】:

  • 谢谢,我删除了“AS”,错误不再出现。我读了你的另一个答案,不限制任何给定 String 或 char 类型中的字符数量真的有用吗?
  • @Diego:如果你真的需要限制使用varchar(n)CHECK 约束。永远不要使用基本上已经过时的char(n)。我添加了一些基础知识链接。
  • 我刚才已经在阅读您的其他问题了,谢谢!我仍然没有得到的是但是如果你想在新数据库中创建对象,你必须连接到它。我如何将表连接到数据库?
  • 您不是“连接表”,而是连接您的会话。然后运行CREATE TABLE ...我在上面添加了分步说明。
  • 'VARCHAR(#)' 和 'TEXT' 的大小写是否等同于数字类型的 'NUMERIC'?
【解决方案2】:

CREATE DATABASE database 之后缺少;(也许给数据库一个更好的名字)。

【讨论】:

  • 这个答案与OP问题无关
猜你喜欢
  • 2022-01-27
  • 2020-02-22
  • 2013-08-26
  • 1970-01-01
  • 2018-09-06
  • 2018-11-06
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多