数据库表有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. mongodb自动关闭:页面太小,无法完成操作

    解决方法: 增大虚拟内存

  2. vncserver的安装和使用 2

    环境:RedHat Linux 6企业版.Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远程通过字符界面来操作Linux,但是对于更多熟悉图形人来说是很不方便的, ...

  3. 【Java面试题】59 Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

    Math类中提供了三个与取整有关的方法:ceil.floor.round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11. ...

  4. mongodb php auto increment 自增

    mongodb的自增实现根oracle,postgresql是差不多,都是通过计数器来实现的. oracle自增实现: 实例说明oracle序列用法 postgresql自增实现: postgresq ...

  5. NGUI之scroll view的制作和踩坑总结

    之前也看了不少童鞋谢了关于NGUI的scroll view的制作下面我写下自己的制作过程以及心得,希望对童鞋们有所帮助.1.首先建立一个960*640的背景参考http://game.ceeger.c ...

  6. IPV6设置

    C:\Windows\System32\drivers\etc 目录下修改hosts文件. 网上有更新的ipv6 hosts文件,复制下来~ 别人不断更新的: https://raw.githubus ...

  7. 【转自IT虾米网:www.itxm.net】外部应用和drools-wb6.1集成解决方案

    一.手把手教你集成外部应用和drools workbench6.1 1.         首先按照官方文档安装workbench ,我用的是最完整版的jbpm6-console的平台系统,里面既包含j ...

  8. jQuery弹出层效果

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  9. linux中,如何设置每隔2个小时就执行一次某个脚本?

    需求描述: 今天同事问了一个linux上crontab定时任务的问题,说,如何调整一个定时任务每2个小时 执行一次,在此记录下. 操作过程: 1.通过以下的方式设置,每2个小时执行一次脚本 */ * ...

  10. MBR和GPT分区表

    https://www.reneelab.com.cn/m/mbr-gpt-difference.html