postgresql----數據庫表約束----NOT NULL,DEFAULT,CHECK


數據庫表有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
*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM