在PostgreSQL中,当一列被标记为NOT空并且在插入期间没有为其提供任何值时,就会引发错误.然而,在SQL中,如果没有提供值,则会根据列的类型设置默认值,例如字符串值为'',integer为0,float为0.00(小数位数:2)等.值得注意的是,即使在SQL中,无论是否明确提及默认值,这种行为都会发生.

Example:

ALTER TABLE errors ADD COLUMN user_id INT NOT NULL

在SQL中,如果没有提供值,它会插入0,而PostgreSQL会抛出错误.

PostgreSQL中是否有一种方法或数据库设置来实现类似的行为,其中会自动为标记为NOT空的列设置默认值?

我正在nestjs中使用TypORM,我不想像这样显式地 for each 列提供默认值

@Column('int', { default: 0 })
user_id: number;

EDIT 1:我需要这样的东西:STRICT_TRANS_TABLES

EDIT 2:我发现了SQL是如何做到这一点的,只是需要它用于postquist,或者想知道它是否在postquist中不可能.Implicit Default Handling in MYSQL

推荐答案

Quoting the doc:

如果列没有默认值,则默认值为空.

不幸的是,没有任何设置可以将这种行为全局更改为类型特定默认值empty-but-not-null.如果这是您需要的,您必须每次在DB end添加alter table..alter column..set default:demo

ALTER TABLE errors 
  ALTER COLUMN user_id SET DEFAULT 0,
  ALTER COLUMN name SET DEFAULT '',
  ALTER COLUMN salary SET DEFAULT 0.0,
  ALTER COLUMN created_at SET DEFAULT '-infinity'::timestamptz,
  ALTER COLUMN duration SET DEFAULT '[-infinity,infinity)'::tstzrange;

或者每次在你的column options分中,就像你所展示的那样

@Column({type:'int', default: 0, nullable: false })
user_id: number;

在这两种情况下,如果您不喜欢手工输入全部内容,则应该能够设置IDE和/或CI/CD管道来动态添加内容.

如果您想批量添加它,您可以删除超过information_schema.columns个,找出那些where is_nullable='NO'并判断它们的column_default.您可以循环使用该值并使用动态SQL添加特定的empty-but-not-null值作为默认值.该脚本可以作为迁移中的后期步骤集成,以便当您添加新模型/表时,它们也会得到处理.

select * 
from information_schema.columns
where is_nullable='NO' 
  and column_default is null
  and table_name='errors';

Postgresql相关问答推荐

Postgr不列出运算符和函数

无法在PostgreSQL中创建方案和表

包含JSONB属性的过滤器的索引策略

PostgreSQL(container)中使用80K子分区表处理共享内存不足错误

如何使用docker/docker-compose转到本地主机?

为什么更新不设置较晚的结束时间?

在Postgres中,如何删除包含N个自然数的表,并替换为生成子查询?

我可以将jsonb_set与来自SELECT语句的新值(第三个参数)一起使用吗?

即使不对订阅服务器进行任何修改,Postgres逻辑复制也可能发生冲突吗?

返回行值和行计数的总和

使用 GDB 调试器调试 AGE 代码的过程

在 PostgreSQL 中 Select 数字命名列会返回 ?column?

如何将 NULL 值插入 UUID 而不是零

需要将整个 postgreSQL 数据库加载到 RAM 中

如何防止用户看到其他数据库和其他数据库中的表?

Postgres 外键on update和on delete选项如何工作?

从 PostgreSQL 序列中 Select 多个 id

将数据从 MS SQL 迁移到 PostgreSQL?

使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询

如何使用 PostgreSQL 在任何列中查找所有具有 NULL 值的行