數據庫中的約束
阿新 • • 發佈:2018-06-23
外鍵 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無法區分唯一性,實際中可以再設一個非空就可以了
數據庫中的約束