DEFAULT NULL 和“没有默认值的可空值”完全相同吗?

San*_*Kim 5 postgresql datatypes default-value postgresql-9.6

ALTER TABLE test_table ADD COLUMN a DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)

对比

ALTER TABLE test_table ADD COLUMN a;
Run Code Online (Sandbox Code Playgroud)

NULL如果a未指定列,则将设置两列。

据我所知,如果我将一列添加到生产数据库中具有默认值的表中,则可能会导致用默认值重写所有行时出现问题。

DEFAULT NULL一样的吗?

Erw*_*ter 10

不,完全一样。NULL只是数据类型的默认值(原文如此!)。

Postgres 15 附带的所有内置数据类型都NULL默认为1。但这并不一定适用于所有类型。CREATE TYPECREATE DOMAIN提供设置任何默认值,除非DEFAULT设置了显式设置,否则该默认值适用于该类型的所有表列。

1除了一个特殊的例外情况:信息模式附带的一种数据类型,通常在模式搜索路径中不可见: information_schema.time_stamp,默认为('now'::text)::timestamp(2) with time zone

domain用更短的 as来演示。但这同样适用于非域数据类型:

CREATE DOMAIN text_x AS TEXT DEFAULT 'X';

CREATE TABLE tbl (
   col_no_default text_x
 , col_default    text_x DEFAULT NULL
);
Run Code Online (Sandbox Code Playgroud)

的默认值为col_no_default'X',而 的默认col_default值为NULL

INSERT INTO tbl1 DEFAULT VALUES RETURNING *;
Run Code Online (Sandbox Code Playgroud)
列号默认值 列默认值
X 无效的

数据库小提琴


a_h*_*ame 6

不提供任何默认值或显式提供 NULL 与基本数据类型完全相同。

添加具有 NULL 默认值的列,不需要重写整个表。它本质上只是表的元数据更新。

引自 9.6 手册

如果没有DEFAULT子句,这只是元数据更改,不需要立即更新表的数据;添加的 NULL 值在读出时提供,而不是



请注意,这在 Postgres 11 中发生了变化。

当您添加具有静态默认值(例如default 42)的列时,该表也不会被重写。仅当您提供“易失性”默认值(例如current_timestamp)时,该表才会被重写。