Sql条件不空约束

Hei*_*ich 24 sql constraints notnull


我很想知道是否有可能在sql中创建一个条件非空约束?换句话说,可以创建一个约束,使得列B可以为空,因为列A包含让我们说"新",但如果列A的内容更改为其他内容,则不再允许列B为空?
为了扩展,只要列A表示"新",就可以使列B必须为空或为空?
谢谢大家:D

Mic*_*uen 30

这对于CONSTRAINT CHECK来说非常好.这样做:

需求:

是否有可能创建一个约束,使得列B可以为空,因为列A包含让我们说"新",但如果列A的内容更改为其他内容,则不再允许列B为空?

注意短语:列B 可以为空

解:

create table tbl
(
    A varchar(10) not null,
    B varchar(10),

    constraint uk_tbl check
    (
      A = 'NEW' -- B can be null or not null: no need to add AND here
      OR (A <> 'NEW' AND B IS NOT NULL)
    )
);
Run Code Online (Sandbox Code Playgroud)

您可以进一步简化它:

create table tbl
(
    A varchar(10) not null,
    B varchar(10),

    constraint uk_tbl check
    (
      A = 'NEW' 
      OR B IS NOT NULL
    )
);
Run Code Online (Sandbox Code Playgroud)

要求与上述要求互不相符:

为了扩展,只要列A表示"新",就可以使列B必须为空或为空?

请注意短语:列B 必须为空

create table tbl
(
    A varchar(10) not null,
    B varchar(10),

    constraint uk_tbl check
    (
      (A = 'NEW' AND B IS NULL)
      OR A <> 'NEW'
    )
);
Run Code Online (Sandbox Code Playgroud)

可以简化这个,更简单,但可能不像上面那样可读:

create table tbl
(
    A varchar(10) not null,
    B varchar(10),

    constraint uk_tbl check
    (
      A <> 'NEW'
      OR B IS NULL
    )
);
Run Code Online (Sandbox Code Playgroud)

  • 我相信这个*不会起作用的唯一现代SQL dbms是MySQL.MySQL不强制执行CHECK()约束.(问题标记为"SQL",因此评论似乎相关.) (3认同)