在PostgreSQL中创建空表

8
我希望在PostgreSQL数据库中创建一个简单的表格。 根据文档,使用CREATE TABLE命令可以在当前数据库中创建一个新的、初始为空的表格。该表格将被发出此命令的用户所拥有。
CREATE TABLE *table_name*;

我原以为我会得到一张新的空表。但是当我使用一个空参数列表时,psql却抛出了ERROR: syntax error at or near ";"的错误。

CREATE TABLE *table_name*();

psql告诉我,该表是通过以下方式创建的

postgres=# create table *table_name*();
CREATE TABLE

但是\l命令没有显示新创建的表格。并且使用psql -d table_name -U user_name也无法登录。有谁能提供帮助吗?


你真的需要一个没有列的表吗?通常称没有记录的表为空表,而没有列的表有点奇怪。 - mlt
你需要添加列。或者,由于你使用的是Rails,可以通过迁移完成。如果你想要与现有的数据库集成,最好使用原始SQL语句。 - mlt
Rails也可以通过rake db:create或其他方式为您创建数据库。 - mlt
哦,太好了,我不知道那个。我一定会去看看的。 - theDrifter
4个回答

9
您可以创建一个没有任何列的表格,甚至在其中添加一些行:

CREATE TABLE nocolumn (dummy INTEGER NOT NULL PRIMARY KEY)
    ;

INSERT INTO nocolumn(dummy) VALUES (1);

ALTER TABLE nocolumn
        DROP COLUMN dummy;

\d nocolumn

SELECT COUNT(*) FROM nocolumn;

输出:

CREATE TABLE
INSERT 0 1
ALTER TABLE
   Table "tmp.nocolumn"
 Column | Type | Modifiers 
--------+------+-----------

 count 
-------
     1
(1 row)

过于复杂的方法。只需要 CREATE TABLE mytable (); 就足够了。 - theberzi

8
您似乎混淆了“数据库”和“表”的术语。
但是,\l 不显示新创建的表。
当然,\l 将列出 数据库 而不是关系。要查看所有表,您需要使用 \d\dt
而且,使用 psql -d table_name -U user_name 登录也是不可能的。
当然这是不可能的,因为 -d 参数用于指定一个 数据库,而不是一个

4

我不确定其他答案为什么建议创建一个带有列的表,然后忽略该列。这当然是可能的,但它似乎与您尝试做的不同。

看起来你需要使用括号:

postgres=# CREATE TABLE t ();
CREATE TABLE

插入一行:
postgres=# INSERT INTO t DEFAULT VALUES;
INSERT 0 1

要计算您插入的行数:

postgres=# SELECT FROM t;
--
(2 rows)

你不能删除单行,因为所有行都是相同的。但是要完全清空表格,可以使用没有WHEREDELETETRUNCATE TABLE

更多信息可以在这里找到:PostgreSQL: 没有列的表格

话虽如此,我必须说我将空表解释为"没有行"的表,不一定是没有列。


1
一个小时前,我建议至少添加一列类似于这样的内容:
create table tab1 (columnname varchar(42) not null)

但是正如一位评论者所说,这似乎并不必要。(我考虑将错误答案保留在此处,而不是删除它,以防止其他人提出相同的建议)


这并不是一个真正的答案,除非你实际上添加了一个代码块来展示如何添加列,在最好的情况下,这只是对提问者的讽刺,你可以在评论中做到这一点,而不必将其作为答案发布。 - davethecoder
我刚刚尝试使用混合服务器类型的数据库客户端(HeidiSQL)创建一个无列表,但它总是阻止生成没有列的表。无论如何,我想不出包含没有列的表有什么有用的用途,使其能够携带数据。但还是感谢你的负评.. 再来两个,我就可以获得同侪压力徽章 -.- - André Kleinschmidt
有一个规则,那就是答案就是答案。如果你问一个问题,人们会不会只回答“你做错了”这样的答案呢? - davethecoder
我也没有点踩。如果我点踩了,我会说的,除非它真的很糟糕。 - davethecoder
3
在Postgres中,实际上可以创建一个没有列的表。使用create table empty();就可以成功创建。 - user330315
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接