为什么在执行 INSERT 时不能在 NOT NULL 列中省略具有默认值的 属性?

Why can't I omit a property with a default value in a NOT NULL column when performing an INSERT?

我有以下 table currencies 的架构:

CREATE TABLE IF NOT EXISTS public.currencies
(
    currency_id integer NOT NULL DEFAULT nextval('currencies_currency_id_seq'::regclass),
    name text COLLATE pg_catalog."default" NOT NULL,
    abbreviation character varying(10) COLLATE pg_catalog."default" NOT NULL,
    base_value integer NOT NULL,
    prepend_symbol_flg boolean NOT NULL DEFAULT false,
    CONSTRAINT currencies_pkey PRIMARY KEY (currency_id)
)

请注意 prepend_symbol_flgNOT NULL 并且有一个默认值。

我在 node.js 中使用以下 INSERT 语句编写了一个 REST API:

pool.query(
      `INSERT INTO currencies (
        name, abbreviation, base_value, prepend_symbol_flg
      ) VALUES (, , , ) RETURNING *`,
      [name, abbreviation, base_value, prepend_symbol_flg]
)

当我将 POST 发送到具有以下正文的端点时:

{
    "name": "copper piece",
    "abbreviation": "cp",
    "base_value": 1
}

Postman报错如下: null value in column "prepend_symbol_flg" of relation "currencies" violates not-null constraint.

我知道这是因为正文不包含 prepend_symbol_flg 键值对,但这不是默认值的用途吗?因此,如果未提供值,则会使用默认值吗?

我需要做什么才能在用户未为此字段提供值时使用默认值?

INSERT 语句中根本没有指定列时,将使用默认值。当传递 NULL 值时不使用它 - 您的查询确实如此。您需要在 JS (prepend_symbol_flg ?? false) 中进行默认设置,或者根据 JSON 正文中存在的字段动态创建查询字符串。