我是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”的值?如果没有,如何区分空文本字段和具有空值的字段?
答案 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