数据库表有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. Spring 4 官方文档学习(九)数据访问之事务管理

    说明:未整理版,未完待续,请绕行 本部分的重点是数据访问以及数据访问层与业务层之间的交互. 1.Spring框架的事务管理 介绍 http://docs.spring.io/spring/docs/c ...

  2. javascript -- js正则表达式

    正则表达式可以:  1.测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 2.替换文本.可以在文档中使用一个正则 ...

  3. Fastqc 能够识别的碱基编码格式

    Fastqc 能够自动识别序列的碱基编码格式,我查看一下源代码,发现是碱基编码格式一共分为 1)sanger/illumina 1.9 2) illumina 1.3 3) illumina 1.5 ...

  4. 前台的js对象数组传到后台处理。在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>

    前台的js对象数组传到后台处理.在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>

  5. 图片后门捆绑利用工具 – FakeImageExploiter

    在这里,要向大家推荐一款名为“Fake Image Exploiter”的安全工具,该工具可以在图片文件中捆绑隐藏的恶意.bat或.exe程序,方便钓鱼或社工攻击测试过程中的入侵控制.如果受害者点击该 ...

  6. hadoop基础学习---基本概念

    1.组成部分HDFS和MapReduce 2.HDFS这几架构

  7. [深入理解Android卷一全文-第四章]深入理解zygote

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的所有内容. ...

  8. mybatis由浅入深day01_4入门程序_4.6根据用户id(主键)查询用户信息

    4 入门程序 4.1 需求 根据用户id(主键)查询用户信息 根据用户名称模糊查询用户信息 添加用户 删除 用户 更新用户 4.2 环境 java环境:jdk1.7.0_72 eclipse:indi ...

  9. 多字节(一般指GBK) utf8 Unicode 编码互转

    // c:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinNls.h #define CP_ACP 0 // default to ANS ...

  10. ecplise部署gradle web项目

    gradle项目结构图: build.gradle apply plugin: 'java' apply plugin: 'war' //用来生成war apply plugin: 'eclipse- ...