注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL:如何限制一个表的多个字段不能同时为空?  

2013-07-09 15:15:51|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

          今天有开发组的同事咨询数据库是否有方法可以限制一个表中的多个字段不能同时为空,起始
想到的是创建 trigger 的方法,但 trigger 比较费性能,不建议使用,后来想到可以通过创建约束轻松
实现,如下:

一 演示
--1.1 创建测试表,
 [pg93@redhatB pg_root]$ psql francs francs
psql (9.3beta1)
Type "help" for help.

francs=> create table test_con (col_a character varying(32),col_b character varying(32),col_c character varying(32));
CREATE TABLE
   

--1.2 增加表约束
 francs=> alter table test_con add constraint con_1 check (col_a is not null or col_b is not null or  col_c is not null);
ALTER TABLE

francs=> \d test_con
          Table "francs.test_con"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 col_a  | character varying(32) | 
 col_b  | character varying(32) | 
 col_c  | character varying(32) | 
Check constraints:
    "con_1" CHECK (col_a IS NOT NULL OR col_b IS NOT NULL OR col_c IS NOT NULL)
 备注:三个字段不能同时为空。

--1.3 插入数据测试
 francs=> insert into test_con (col_a,col_b,col_c) values ('a','a','a');
INSERT 0 1
francs=> insert into test_con (col_a,col_b,col_c) values ('a',null,null);
INSERT 0 1
francs=> insert into test_con (col_a,col_b,col_c) values (null,'a',null);
INSERT 0 1
francs=> insert into test_con (col_a,col_b,col_c) values (null,null,'a');
INSERT 0 1

francs=> select * from test_con;
 col_a | col_b | col_c 
-------+-------+-------
 a     | a     | a
 a     |       | 
       | a     | 
       |       | a
(4 rows)

francs=> insert into test_con (col_a,col_b,col_c) values (null,null,null);
ERROR:  new row for relation "test_con" violates check constraint "con_1"
DETAIL:  Failing row contains (null, null, null).
 备注:创建约束能轻松满足需求,当然也可以创建触发器实现此功能,这里不演示了。
 
二 参考
  

  评论这张
 
阅读(6002)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016