Postgresql 如果提供的值为Null,则希望不为Null,并默认为False

Postgresql 如果提供的值为Null,则希望不为Null,并默认为False,postgresql,Postgresql,我想做到这一点: 列bool不为空 当提供的值为空时,它将用默认值false 我想这会使它: create table public.testnull ( xid integer not null, bool boolean default false ) 测试出错 insert into public.testnotnull values(2, null) ERROR: null value in column "bool" violates not-null

我想做到这一点:

  • 列bool不为空
  • 当提供的值为空时,它将用默认值
    false
  • 我想这会使它:

    create table public.testnull
    (
        xid integer not null, bool boolean default false
    )
    
    测试出错

    insert into public.testnotnull values(2, null)
    ERROR:  null value in column "bool" violates not-null constraint
    DETAIL:  Failing row contains (2, null).
    SQL state: 23502
    
    这将运行,但不会使用默认值。请不要告诉我使用触发器

    CREATE TABLE public.testnull
    (
        xid integer NOT NULL,    bool boolean DEFAULT false
    )
    
    • 您需要在
      INSERT
      语句中使用
      DEFAULT
      关键字,而不是
      NULL

      • :
        DEFAULT
        :相应的列将填充其默认值。标识列将由关联序列生成的新值填充。对于生成的列,允许指定此项,但仅指定从其生成表达式计算列的正常行为

    • 另外,在使用
      INSERT
      时,请始终明确指定列名

      • 从几十年的经验来看:除非您使用的是ORM,否则不可能使
        CREATE TABLE
        定义和
        INSERT
        语句保持同步,最终您将在
        INSERT
        语句不期望的地方添加新列或更改现有列,所有内容都将中断

    请不要告诉我使用触发器

    CREATE TABLE public.testnull
    (
        xid integer NOT NULL,    bool boolean DEFAULT false
    )
    
    但是,如果您想在这样的语句中将
    NULL
    更改为
    DEFAULT
    FALSE
    插入表(xid,bool)值(2,NULL)
    ,则必须使用
    触发器。这是不可能的

    (当然,您可以将
    视图
    与自定义
    插入
    处理程序一起使用,但这与创建触发器是一样的)。

    • 您需要在
      INSERT
      语句中使用
      DEFAULT
      关键字,而不是
      NULL

      • :
        DEFAULT
        :相应的列将填充其默认值。标识列将由关联序列生成的新值填充。对于生成的列,允许指定此项,但仅指定从其生成表达式计算列的正常行为

    • 另外,在使用
      INSERT
      时,请始终明确指定列名

      • 从几十年的经验来看:除非您使用的是ORM,否则不可能使
        CREATE TABLE
        定义和
        INSERT
        语句保持同步,最终您将在
        INSERT
        语句不期望的地方添加新列或更改现有列,所有内容都将中断

    请不要告诉我使用触发器

    CREATE TABLE public.testnull
    (
        xid integer NOT NULL,    bool boolean DEFAULT false
    )
    
    但是,如果您想在这样的语句中将
    NULL
    更改为
    DEFAULT
    FALSE
    插入表(xid,bool)值(2,NULL)
    ,则必须使用
    触发器。这是不可能的

    (当然,您可以将
    视图
    与自定义
    插入
    处理程序一起使用,但这与创建触发器是一样的)