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



对于表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中编写了一个REST API,其中包含以下INSERT语句:

pool.query(
`INSERT INTO currencies (
name, abbreviation, base_value, prepend_symbol_flg
) VALUES ($1, $2, $3, $4) 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主体中存在的字段动态创建查询字符串。