PostgreSQL:为什么\ d +表未将默认显示为null

时间:2018-10-09 13:03:21

标签: postgresql

我是MySQL的Postgres的新手。

我创建了一个表,其中列'col'的默认值为null。

CREATE TABLE widgets (id serial primary key, col bigint default null);
CREATE TABLE
test=# \d+ widgets;
                                                Table "public.widgets"
 Column |  Type   | Collation | Nullable |               Default               | Storage | Stats target | Description 
--------+---------+-----------+----------+-------------------------------------+---------+--------------+-------------
 id     | integer |           | not null | nextval('widgets_id_seq'::regclass) | plain   |              | 
 col    | bigint  |           |          |                                     | plain   |              | 
Indexes:
    "widgets_pkey" PRIMARY KEY, btree (id)

test=# 

但是,在“默认”列中没有任何内容表明它是空字段。

默认值是否应该在模式输出中显示为null?

我也尝试了上面相同的示例,但是使用了default 99。键入\d+时,“默认”列中没有任何显示。在该示例中,我插入一行INSERT INTO widgets (id) VALUES (1);,该行将获得默认值99,因此我知道正在使用默认值(至少对于整数值)。 更新:默认列实际上显示为99。我曾使用\ d +进行自动填充,并查看了错误的表。

default null中,当我SELECT * FROM widgets时,该列显示为空白。

Postgres是否未显式显示标记为“ null”的值?如果没有,如何区分空文本字段和具有空值的字段?

1 个答案:

答案 0 :(得分:3)

未指定任何内容时,列的默认值始终为null。显然,psql开发人员认为,将null作为默认值是没有道理的。可能因为这是标准行为,或者因为null不是“值”。

\d输出中仅显示非空的默认值。


  

如何区分空文本字段和具有空值的字段?

空字符串''null值有所不同,您将在输出中看到差异:

postgres=# CREATE TABLE null_test (c1 text default null, c2 text default '');
CREATE TABLE
postgres=# \d null_test
            Table "public.null_test"
 Column | Type | Collation | Nullable | Default
--------+------+-----------+----------+----------
 c1     | text |           |          |
 c2     | text |           |          | ''::text