数据库表有NOT NULL,DEFAULT,CHECK,UNIQUE,PRIMARY KEY,FOREIGN KEY六种约束。

一、NOT NULL ---- 非空约束

NULL表示没有数据,不表示具体的数值,所以在数据库中NULL是不等于NULL的。判断表中的一个单元格是不是NULL使用的是IS NULL或者IS NOT NULL,而不是=NULL或者!=NULL,当一个字段设置NOT NULL约束后,INSERT时必须给该字段赋值,否则拒绝写入。在一些程序语言(如C)查询结果中出现NULL有可能会直接作为空指针,如果使用不当,会直接导致程序崩溃。所以一个字段要尽可能的设置NOT NULL约束,或者DEFAULT约束,当然OUTER JOIN的结果也有可能引入NULL,所以开发过程中要尽可能的做好保护。

1.设置NOT NULL约束的字段INSERT必须赋值,没有NOT NULL约束的字段INSERT没有赋值,会自动填充NULL。

/*
postgres=# create database test with template = template0 encoding='UTF8' lc_collate='C' lc_ctype='C';
CREATE DATABASE
postgres=#
postgres=#
postgres=#
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create table tbl_null (a int not null,b varchar(12));
CREATE TABLE
test=# insert into tbl_null (a,b) values(1,'1');
INSERT 0 1
test=# insert into tbl_null (a) values(2);
INSERT 0 1
test=# insert into tbl_null (b) values('3');
ERROR: null value in column "a" violates not-null constraint
DETAIL: Failing row contains (null, 3).
test=# select * from tbl_null;
a | b
---+---
1 | 1
2 |
(2 rows)
*/

2.NOT NULL约束增加

已存在的字段设置NOT NULL约束前必须先删除为NULL的数据行。

/*
test=# alter table tbl_null alter COLUMN b set not null;
ERROR: column "b" contains null values
test=# delete from tbl_null where b is null;
DELETE 1
test=# alter table tbl_null alter COLUMN b set not null;
ALTER TABLE
test=# \d tbl_null
Table "public.tbl_null"
Column | Type | Modifiers
--------+-----------------------+-----------
a | integer | not null
b | character varying(12) | not null test=# select * from tbl_null ;
a | b
---+---
1 | 1
(1 row)
*/

3.删除NOT NULL约束

/*
test=# alter table tbl_null alter COLUMN b drop not null;
ALTER TABLE
test=# \d tbl_null
Table "public.tbl_null"
Column | Type | Modifiers
--------+-----------------------+-----------
a | integer | not null
b | character varying(12) |
*/

二、DEFAULT ---- 默认值

INSERT没有赋值的字段默认填充NULL(前提是该字段没有NOT NULL约束),设置DEFAULT默认值,INSERT没有赋值会默认填充该默认值。尤其是设置NOT NULL约束的字段,如果给定一个DEFAULT约束,即使INSERT没有给字段赋值也不会出错。

1.设置DEFAULT约束,既可以在创建表时直接设置,也可以在创建表后修改字段,字段新增默认值约束可以不用考虑已有数据。

/*
test=# create table tbl_default(a int not null,b varchar(12) not null default 'try me');
CREATE TABLE
test=# \d tbl_default
Table "public.tbl_default"
Column | Type | Modifiers
--------+-----------------------+----------------------------------------------
a | integer | not null
b | character varying(12) | not null default 'try me'::character varying test=# drop table tbl_default ;
DROP TABLE
test=# create table tbl_default(a int not null,b varchar(12) not null);
CREATE TABLE
test=# alter table tbl_default alter COLUMN b set default 'try me';
ALTER TABLE
test=# \d tbl_default
Table "public.tbl_default"
Column | Type | Modifiers
--------+-----------------------+----------------------------------------------
a | integer | not null
b | character varying(12) | not null default 'try me'::character varying
*/

2.INSERT时赋值使用赋值填充,否则使用默认值填充。

/*
test=# insert into tbl_default (a,b) values(1,'aloha');
INSERT 0 1
test=# insert into tbl_default (a) values(2);
INSERT 0 1
test=# select * from tbl_default ;
a | b
---+--------
1 | aloha
2 | try me
(2 rows)
*/

3.默认值约束的修改与删除,修改默认值直接新设置一个默认值即可。

/*
test=# alter table tbl_default alter COLUMN b set default 'my god';
ALTER TABLE
test=# \d tbl_default
Table "public.tbl_default"
Column | Type | Modifiers
--------+-----------------------+----------------------------------------------
a | integer | not null
b | character varying(12) | not null default 'my god'::character varying test=# alter table tbl_default alter COLUMN b drop default;
ALTER TABLE
test=# \d tbl_default
Table "public.tbl_default"
Column | Type | Modifiers
--------+-----------------------+-----------
a | integer | not null
b | character varying(12) | not null */

三、CHECK ---- 检查约束

INSERT,UPDATE时检查字段值是否满足CHECK条件,若不满足则拒绝写入。

1.CHECK约束的设置

/*
test=# create table tbl_check(a int not null check (a>0),b varchar(12) not null check (b in ('ab','Ab','aB','AB')));
CREATE TABLE
test=# drop table tbl_check ;
DROP TABLE
test=# create table tbl_check
test-# (
test(# a int not null,
test(# b varchar(12) not null,
test(# constraint ck_tbl_check_a check (a > 0),
test(# constraint ck_tbl_check_b check (b in ('ab','aB','Ab','AB'))
test(# );
CREATE TABLE
test=# create table tbl_check
(
a int not null,
b varchar(12) not null);
CREATE TABLE
test=# alter table tbl_check add constraint ck_tbl_check_a check (a > 0);
ALTER TABLE
test=# alter table tbl_check add constraint ck_tbl_check_b check (b in ('ab','aB','Ab','AB'));
ALTER TABLE
test=# \d tbl_check
Table "public.tbl_check"
Column | Type | Modifiers
--------+-----------------------+-----------
a | integer | not null
b | character varying(12) | not null
Check constraints:
"ck_tbl_check_a" CHECK (a > 0)
"ck_tbl_check_b" CHECK (b::text = ANY (ARRAY['ab'::character varying, 'aB'::character varying, 'Ab'::character varying, 'AB'::character varying]::text[]))
*/

2.以上表tbl_check为例,INSERT时a的值必须是大于0的整数,b的值只能在'ab','aB','Ab','AB'范围内。

/*
test=# insert into tbl_check (a,b) values(1,'ab');
INSERT 0 1
test=# insert into tbl_check (a,b) values(-1,'ab');
ERROR: new row for relation "tbl_check" violates check constraint "ck_tbl_check_a"
DETAIL: Failing row contains (-1, ab).
test=# insert into tbl_check (a,b) values(1,'ac');
ERROR: new row for relation "tbl_check" violates check constraint "ck_tbl_check_b"
DETAIL: Failing row contains (1, ac).
*/

3.CHECK约束的删除

/*
test=# alter table tbl_check drop constraint ck_tbl_check_a;
ALTER TABLE
test=# insert into tbl_check (a,b) values(-1,'ab');
INSERT 0 1 */

4.CHECK约束的增加

新增CHECK约束必须首先删除已存在的不满足约束的数据

/*
test=# alter table tbl_check add constraint ck_tbl_check_a check (a > 0);
ERROR: check constraint "ck_tbl_check_a" is violated by some row
test=# delete from tbl_check where a <= 0;
DELETE 1
test=# alter table tbl_check add constraint ck_tbl_check_a check (a > 0);
ALTER TABLE
*/

postgresql----数据库表约束----NOT NULL,DEFAULT,CHECK的更多相关文章

  1. 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK

    如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...

  2. postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改

    如果在建表时没有加primary key约束.not null约束.unique约束.default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_pac ...

  3. PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库

    最近准备下PostgreSQL数据库开发的相关知识,本文把总结的PPT内容通过博客记录分享,本随笔的主要内容是介绍PostgreSQL数据库的基础信息,以及如何在我们的开发框架中使用PostgreSQ ...

  4. 访问GitLab的PostgreSQL数据库,查询、修改、替换等操作

    1.登陆gitlab的安装服务查看配置文件 cat /var/opt/gitlab/gitlab-rails/etc/database.yml production: adapter: postgre ...

  5. 访问GitLab的PostgreSQL数据库-(3)

    1.登陆gitlab的安装服务查看配置文件 cat /var/opt/gitlab/gitlab-rails/etc/database.yml production: adapter: postgre ...

  6. 访问GitLab的PostgreSQL数据库

    1.登陆gitlab的安装服务查看配置文件 cat /var/opt/gitlab/gitlab-rails/etc/database.yml production: adapter: postgre ...

  7. postgresql 数据库,模式,表空间的关系

    数据库与模式模式(schema)是对数据库(database)逻辑分割在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式.所有为此数据库创建的对象(表.函数 ...

  8. Solr 4.4.0利用dataimporthandler导入postgresql数据库表

    将数据库edbstore的edbtore schema下的customers表导入到solr 1. 首先查看customers表字段信息 edbstore=> \d customers Tabl ...

  9. Oracle数据库迁移至PostgreSQL数据库问题及解决

    Oracle数据库迁移PostgreSQL数据库问题及解决 目录 如何计划迁移数据库(现状及问题分析) 统计系统表及表功能 解耦公共表 建立数据库 迁移表结构 导入表数据 改SQL语法 保证数据时效性 ...

随机推荐

  1. 【转】nginx中proxy_set_header Host $host的作用

    nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块.其中proxy_set_header指令就是该模块需要读取的配置文件.在这里,所有设置的值的含义和http请 ...

  2. Asynchronous Methods for Deep Reinforcement Learning(A3C)

    Mnih, Volodymyr, et al. "Asynchronous methods for deep reinforcement learning." Internatio ...

  3. e650. 激活事件

    An object wishing to fire item events must implement ItemSelectable. This example shows typical code ...

  4. e642. 处理拖放事件

    The drop target in this example only accepts dropped String objects. A drop target must implement Dr ...

  5. jquery -- onchange

    触发onchange 首先页面有一个input标签,并且已绑定onchange事件,如: 1 <input type="text" onchange="consol ...

  6. HTC Desire 816刷机教程(图文)

    HTC Desire 816刷机教程也来了,今天在这里主要是来说说如何刷机的,这个刷机是采用卡刷的方式,也就是利用第三方的recovery来刷入第三方的zip包,因为第三方的zip包都是支持卡刷的,很 ...

  7. squid2.7安装与配置

    CleverCode近期研究了一下squid的安装与配置. 如今总结一下.分享给大家. 1 简单介绍 代理server英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squ ...

  8. JavaScript 事件参考手册

    事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. 事件句柄 HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元 ...

  9. iis部署网站,使用虚拟路劲

    此前一直使用vs2010,没有考虑过配置IIS,但是一个项目完成后交付给甲方使用.肯定是要考虑IIS的安装和部署的.现从IIS的安装和asp.NET项目的部署两个方面讲解. IIS安装: 网上很多教程 ...

  10. 《R语言入门》语言及环境简单介绍

    简单介绍 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/diss ...