sql資料庫開發 13 約束

2021-10-02 06:55:24 字數 4615 閱讀 1225

約束

約束的作用:

.面臨的問題:

--  某列必須有值而且唯一

--  某列的取值受到另一列取值的限制

.資料庫提供解決方法

--限制無效的資料進入到表中

--資料庫層面的 "安檢"

約束的型別:

primart key              主鍵約束

unique key               唯一鍵約束

not null                 非空約束

references foreing key   外來鍵約束

check                    檢查約束

定義主鍵約束 (一)

.列級約束

create table parent(

c1 number(2) constraint parent_c1_pk primary key,

c2 number  

);定義主鍵約束 (二)

.表級約束

create table parent(

c1 number(2),

c2 number,

constraint parent_c1_pk primary key(c1));

);定義主鍵約束 (三)

. 給存在的表增加約束,語法形式跟表級約束一樣。

alter table parent add constraint parent_c1_pk primary key(c1);

專案案例:

主鍵約束的應用場景和實現

主鍵約束解決的問題:

. 不允許表中有null記錄

. 不允許表中有重覆記錄

非空約束 (not null)

. 不允許將該列的值置為空

. 只有列級約束的形式

..... colname datatype not null;

定義唯一鍵約束 (一)

.列級約束

create table test(

c1 number(3) constraint test_c1_pk parmary key,

c2 number(2) constraint test_c2_uk unique,

c3 number(4) constraint test_c3_uk unique

);定義唯一鍵約束(二)

. 表級約束

create table test(

c1 number(3) constraint test_c1_pk primary key,

c2 number(2),

c3 number(4),

constraint test_c2_c3_uk unique(c2,c3)

專案案例:

唯一鍵約束的應用場景和實現

唯一性約束:

.唯一鍵的列值不允許重複

.唯一鍵上任意一列的取值允許為空

表中記錄的數量關係

一對多關係

-- 乙個客戶可以申請多個業務

-- 乙個業務必須屬於乙個客戶

多對多關係

-- 乙個客戶可以申請多種資費

-- 一種資費可以被多個客戶申請

一對一關係

-- 中國目前的婚姻法規定一夫一妻制

一對多關係的實現

service表中的id列 (業務賬號id) 和account_id列(賬務賬號id) 表述業務和客戶的關係,其中account_id 列的值可以重複,表示乙個客戶可以申請多個業務。

account_id列的值不能任意填,必須是乙個有效客戶的賬務賬號id 。

一對多關係由兩張表實現。

為了保證一對多關係,資料庫層面的實現通過主外來鍵。

為了保證一對多關係,應用系統層面也可通過**實現。

多對多的實現:

客戶和資費是多對多關係,客戶和資費的關係是通過服務實現的。

service表中有account_id列 (賬務賬號id) 和 cost_id 列(資費id),其中account_id和cost_id 都定義成外來鍵,兩列的值都可以重複,表達了多對多。

多對多關係由三張表實現。

一對一關係

.把夫和妻的資訊定義成一張表。

.把夫和妻的資訊各定義成一張表,每張表的id列定義成pk列,其中一張表的pk列同時定義成fk列,實現了對應關係。

合表問題:

一對多關係為什麼不定義成一張表?

-- 違反第三正規化

-- 第三正規化:每個非主屬性不能依賴於另乙個非主屬性

多對多為什麼不定義成一張表 ?

-- 違反第二正規化

-- 第二正規化: 每個非主屬性必須完全依賴於主屬性

定義外來鍵約束 (一)

.  列級約束

create table child(

c1 number(3) constraint child_c1_pk primary key,

c2 number(2) constraint child_c2_fk references parent(1)

定義外來鍵約束 (二)

.  表級約束

create table child(

c1 number(3) constraint child_c1_pk primart key,

c2 number(2),

constraint child_c2_fk foreign key(c2) references parent(c1)

定義外來鍵約束 (三)

.表級約束

create table child1(

c1 number(3) constraint child1_c1_pk primary key,

c2 number(2) constraint child1_c2_fk references parent(1)

on delete cascade);

定義外來鍵約束 (四)

.表級約束

create table child2(

c1 number(3) constraint child2_c1_pk primary key,

c2 number(2) constraint child2_c2_pk references parent(1)

on delete set null

);專案案例

外來鍵約束的應用場景和實現

外來鍵約束

.保證一對多關係

.通過外來鍵(fk)可以與同一張表的主鍵(pk)或唯一鍵(uk)建立引用關係,也可以與不同表的主鍵(pk) 或唯一鍵 (uk) 建立引用關係。

.外來鍵的取值必須匹配父表中已有的值或空值。

外來鍵約束 (fk) 關鍵字

. foreing key

--   用表級約束定義外來鍵時使用該關鍵字

.  refereneces

--   表示引用父表中的某列

.  on delete cascade

--  級聯刪除,刪除父表的記錄前,先刪除子表裡的相關記錄

.  on delete set null

--  刪除父表的記錄前,先將子表中外鍵列的相關值置空

update 語句: 語法

用update 語句更新表中已經存在的記錄,即修改記錄的某列的值

update tabname set colname = value [,colname1= value] [where condition];

delete語句 :語法

用delete語句刪除已存在的記錄

delete [from] tabname [where condition];

e-r圖

. entity (實體)

--屬性

--強制屬性

--主屬性

.  relationsip (關係)

-- 一對多

-- 多對多

-- 一對一

.   e-r圖能設計出符合正規化要求的表

定義檢查約束 (一)

.   列級約束

create table test(

c1 number(3) constraint test_c1_pk primary key,

c2 number(3) constraint test_c2_ck check(c2 > 100)

定義檢查約束 (二)

create table test(

c1 number(3) constraint test_c1_pk primary key,

c2 number(2),

c3 number(2),

constraint test_c2_ck check((c2+c3)>100)

);檢查約束:

.定義條件表示式,每個列值必須滿足該條件

.以下表示式不允許

-- 偽劣: currval、nextval、level、rownum

-- 函式: sysdate、uid、usr、userenv

-- 引用其它記錄的其他值

約束總結:

.定義約束時使用者給它命名,若使用者未命名,系統自動命名形式為sys_cn格式

. 何時建立約束

-- create table 時定義約束

-- 表已經存在,用alter table 追加約束

. 定義約束有表級和列級兩種形式

關於sql資料庫的約束

約束條件在資料庫中的使用。check 約束用於限制列中的值的範圍。如果對單個列定義 check 約束,那麼該列只允許特定的值。如果對乙個表定義 check 約束,那麼此約束會在特定的列中對值進行限制。建立約束 如以下例子 建立如下兩個表 create table kkk tel char 13 pr...

sql資料庫中的約束

先用設計器建立約束,再用 建立約束。資料庫約束是為了保證資料的完整性 正確性 而實現的一套機制 1.非空約束 選擇核取方塊 2.主鍵約束 唯一且不為空,選中列,右鍵設為主鍵 3.唯一約束 唯一允許為空,但只能出現一次,右鍵,索引 鍵,新增,型別 唯一,選擇列 表示唯一約束列不能有重複的值 表中可以包...

資料庫約束

mysql有兩種常用的引擎型別 myisam和innodb。目前只有innodb引擎型別支援外來鍵約束。innodb中外鍵約束定義的語法如下 constraint symbol foreign key index name index col name,references tbl name ind...