1. 程式人生 > >數據庫中的約束

數據庫中的約束

外鍵 char for class 要求 true 沒有 不讓 區分

技術分享圖片

約束的種類

  • 主鍵約束 primary key

這個字段的值必須滿足非空且該字段的值不能重復

一張表中只能有一個主鍵

  • 唯一性約束 unique

這個字段的值不能重復

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

不能檢查NULL值

  • 非空約束 not null

這個字段的值不能是NULL值

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

  • 檢查約束 check(條件)

字段的值必須符合檢查條件(條件由自己指定,where裏寫的這裏都可以寫)

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

建立兩張表的關聯關系

foreign key(外鍵) 指定字段

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無法區分唯一性,實際中可以再設一個非空就可以了

數據庫中的約束