回答

收藏

SQL非空约束条件

技术问答 技术问答 498 人阅读 | 0 人回复 | 2023-09-14

我很好奇是否有可能sql中创建条件非null约束?换句话说,只要能创造约束,就能创造约束吗?A列包含“
( j  _' B) r  i$ Z5 W. C8 zNEW”,那么B列可以是空的,但如果是A列的内容改为其他内容,然后B列不再允许空?% m9 j8 h$ N  z* Q* g5 N
扩展这一点,然后保持不变,只要A列说“ NEW”,B列必须是空的还是空的?
  h* Y5 E: i' |, _  h7 G谢谢大家:D  
( T  Q' |/ \5 h9 R4 v                                                                * H( \$ I& w' ~9 \  e, W2 `+ ~
    解决方案:                                                               
: B7 y5 J0 @# A) ?4 K3 Y                                                                这对于CONSTRAINT CHECK非常合适。只需执行以下操作:- _% G3 z# Z% Y4 m* p/ T
要求:
3 k% i3 G# B, z, d+ G* a% v是否有可能创造一个约束,只要A列包含长行 NEW”,B列可以是空的,但如果是A列的内容改为其他内容,然后B列就不再允许Null?
, F% v* X; e" n5 N请注意以下短语:B列 可以    为空
3 W# B% I5 o7 ^7 i  @1 E6 L  T+ u$ F7 N解决方案:
& r2 y, H5 S' {- q" H7 hcreate table tbl(    A varchar(10) not null,   B varchar   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)   );可以进一步简化:
4 b) b! ?" d9 S7 d0 Acreate table tbl(    A varchar(10) not null,   B varchar   constraint uk_tbl check    (     A = 'NEW        OR B IS NOT NULL   );矛盾的要求与上述要求不符:
) }% q" o8 p" c1 f0 @扩展这一点,然后保持不变,只要A列说“ NEW”,B列必须是空的还是空的?$ M1 p1 c# p8 T% @- P; z3 L
请注意以下短语:B列 必须    为空$ Z/ m' z: [& [- E! u) y
create table tbl(    A varchar(10) not null,   B varchar   constraint uk_tbl check    (     (A = 'NEW' AND B IS NULL)      OR A  'NEW);它可以通过以下方式简化,但可能不如上述可读性:
: V4 E4 k1 U* e) R- s' ncreate table tbl(    A varchar(10) not null,   B varchar   constraint uk_tbl check    (     A  'NEW       OR B IS NULL    );
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则