數據庫中的約束

約束的種類

  • 主鍵約束   primary key

這個字段的值必須知足非空且該字段的值不能重複sql

一張表中只能有一個主鍵spa

 

  • 惟一性約束   unique

這個字段的值不能重複3d

一張表中的惟一性約束個數不受限制blog

不能檢查NULL值table

 

  • 非空約束    not null

這個字段的值不能是NULL值class

一張表中的非空約束個數不受限test

 

  • 檢查約束    check(條件)

字段的值必須符合檢查條件(條件由本身指定,where裏寫的這裏均可以寫)引用

 

  • 外鍵約束    references(參考/ 關聯/ 引用)   

創建兩張表的關聯關係im

          foreign key(外鍵)   指定字段margin

on  delete  cascade      級聯刪除

on delete  set  nill   級聯置空

 約束的實現

  • 列級約束

在創建表時,直接在表的某一列以後加約束限制

  • 表級約束

在創建(定義)完表的全部列以後,再選擇某些列加約束限制

 主鍵的列級約束實現

create table testcolumn_cons(id primary key, name varchar2(30));

 

insert into testcolumn_cons values(1, 'test1');

出錯:00001,惟一性錯誤

若是不給約束起名字,則系統會自動爲約束創建一個惟一的名字(但該名字比較難以理解)

 

如何給約束起名字(出錯判斷時,知道是哪個出錯了)

constraint(關鍵字)  約束名(表名_加約束的字段名_約束類型)
create table testcolumn_cons(id number constraint testcolumn_cons_idpl primary key, name varchar2(30));

 

這樣出錯時就知道是哪裏出了錯(起名要有規律)

主鍵的列級約束

演示:

  • 創建一張表,創建以前先刪表
  • 這張表有id  number是主鍵    
  • fname  varchar2(30)   要求非空   
  • sname varchar2(30)  要求惟一
  • 要求給約束起名字

  

drop table testcolunm_cons;

 

create table testcolumn_cons(
  id number constraint testcolumn_cons_id_pk primary key,
  fname varchar2(30) constraint testcolumn_cons_fname_nn not null,
  sname varchar2(30) constraint testcolumn_cons_sname_un unique
);

  

  查看:

desc table testcolumn_cons;

增長檢查約束:salary  number 檢查條件:要求工資大於3500。

 

create table testcolumn_cons(id number constraint testcolumn_cons_id_pk primary key,
  fname varchar2(30) constraint testcolumn_cons_fname_nn not null,
  sname varchar2(30) constraint testcolumn_cons_sname_un unique,
  salary number constraint testcolumn_cons_salary_ck check(salary>3500)
);

 

  檢測一下: 

insert into testcolumn_cons values(1, 'a', 'b', 3499);

  

主鍵的表級約束

  • 在約束關鍵字後面(要約束的字段名),非空不讓有表級約束。
  • 定義完全部的字段和類型後,加「,」再加上表級約束。

演示:

  • 創建一張表  創建以前先刪表
  • 這張表有id  number 是主鍵
  • fname varchar2(30)
  • sname varchar2(30)   要求惟一
  • salary number  要求工資大於3500
  • 要求給約束起名字
  • 增長約束,檢查約束
create table testtable_cons(
  id number,
  fname varchar2(30),
  sname varchar2(30),
  salary number,
  constraint testtable_cons_id_pk primary key(id),
  constraint testtable_cons_sname_un unique(sname),
  constraint testtable_cons_salary_ck check(salary>3500),
);

not null  沒有表級約束  

聯合約束

在表級約束時,指定約束的字段時,能夠約束多個字段

沒有「聯合非空」的說法,因此非空沒有表級約束

演示:拿上面的例子再作一次,把id和fname綁成一個主鍵——聯合主鍵(理論綁多個)                                                                                                     

把id和fname聯合起來非空且惟一

這樣是隻有一個主鍵的!id+fname是主鍵

id    fname

1     a

1     b

1     NULL

均可以,id重複了也不要緊,由於主鍵是聯合的;

fname是NULL也不要緊,聯合的不爲空就行。

 

create table testtable_cons(
      id number,
  fname varchar2(30),
  sname varchar2(30),
  salary number,
  constraint testtable_cons_id_pk primary key(id),
  constraint testtable_cons_sname_un unique(sname),
  constraint testtable_cons_salary_ck check(salary>3500),
);

表級約束  vs  列級約束

  • 表級約束:能夠作聯合約束
  • 列級約束:書寫簡單直觀,沒法完成聯合約束

實際應用中混着用

惟一性(unique)只能區分非空值,不能夠區分空值(NULL)

兩個或多個NULL沒法區分惟一性,實際中能夠再設一個非空就能夠了 

相關文章
相關標籤/搜索