Oracle的約束介紹與約束維護(hù)
數(shù)據(jù)的完整性用于確保數(shù)據(jù)庫(kù)數(shù)據(jù)遵從一定的商業(yè)的邏輯規(guī)則。在oracle中,數(shù)據(jù)完整性可以使用約束、觸發(fā)器、應(yīng)用程序(過程、函數(shù))三種方法來實(shí)現(xiàn),在這三種方法中,因?yàn)榧s束易于維護(hù),并且具有最好的性能,所以作為維護(hù)數(shù)據(jù)完整性的首選。
一、什么是約束?
約束用于確保數(shù)據(jù)庫(kù)數(shù)據(jù)滿足特定的商業(yè)規(guī)則。
二、約束分類
1、not null(非空)
如果在列上定義了not null,那么當(dāng)插入數(shù)據(jù)時(shí),必須為列提供數(shù)據(jù)。
create table user1(id number,name varchar2(30) not null); insert into user1 values(001,'');//會(huì)報(bào)錯(cuò) --ORA-01400: 無法將 NULL 插入 ("SCOTT"."USER1"."NAME")
2、default(默認(rèn))
插入null值時(shí),提供默認(rèn)值。
create table yg (編號(hào) number ,姓名 varchar2(10), 基本工資 number(8,2) default 1000) -- 默認(rèn)值的插入方法 insert into yg values(1,'A',default); insert into yg (編號(hào),姓名)values(1,'A');
3、unique(唯一)
當(dāng)定義了唯一約束后,該列值是不能重復(fù)的,但是可以為null。
create table user2(id number unique,name varchar2(30)); insert into user2 values(1,111);//id輸入重復(fù)的值是會(huì)報(bào)錯(cuò) --ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011172)
注意:oracle中unique可以為null,而且允許多行為null
4、primary key(主鍵)
用于唯一的標(biāo)識(shí)表行的數(shù)據(jù),當(dāng)定義主鍵約束后,該列不但不能重復(fù),而且不能為null。需要說明的是:一張表最多只能有一個(gè)主鍵,但是可以有多個(gè)unique約束。
create table user3(id number primary key,name varchar2(30)); insert into user3 values(1,111); insert into user3 values(1,111);//報(bào)錯(cuò),唯一性 --ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011173) insert into user3 values(null,111);//報(bào)錯(cuò),不能為null --ORA-01400: 無法將 NULL 插入 ("SCOTT"."USER3"."ID")
特別說明primary key與unique的區(qū)別:
- 一張表可以有多個(gè)unique(唯一)約束;
- 一張表只能有一個(gè)主鍵;
- 設(shè)置為主鍵的列不能有null值;
- primary key的所在列,會(huì)自動(dòng)創(chuàng)建索引。但unique不會(huì)自動(dòng)創(chuàng)建索引。
5、foreign key(外鍵):
用于定義主表和從表之間的關(guān)系,外鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique約束,當(dāng)定義外鍵約束后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或是為null。
create table class(id number primary key,name varchar2(32)); create table stus(id number primary key,name varchar2(36) not null,classid number references class(id));
特別說明:froeign key外鍵的細(xì)節(jié)
- 外鍵指向主鍵列;
- 外鍵可以指向unique列;
- 建表時(shí)先建主表,再建從表;刪除表先刪從表,再刪主表。
- 外鍵列屬性值要與主鍵或unique列屬性值一致
- 外鍵列的值,必需在主鍵列中存在。但外鍵列的值允許為null
6、check(檢查)
用于強(qiáng)制行數(shù)據(jù)必須滿足某個(gè)條件,假定在sal列上定義了check約束,并要求sal列值在1000-2000之間,如果不再這個(gè)條件范圍內(nèi)就會(huì)提示出錯(cuò)。
create table user4(id number primary key,sal number check(sal>=1000 and sal<=2000),sex char(2) check(sex in('男','女'))); insert into user4 values(1,1000,'男');//sal列的值不滿足1000至2000,報(bào)錯(cuò)。 --ORA-02290: 違反檢查約束條件 (SCOTT.SYS_C0011178)
小貼士 : not null,default 只能在列內(nèi)定義,其余四中約束都可以在表內(nèi)定義。列內(nèi)定義:就是指在創(chuàng)建表的時(shí)候創(chuàng)建列在‘,’之前所寫的。
二、列級(jí)定義與表級(jí)定義
1、列級(jí)定義
列級(jí)定義是在定義列的同時(shí)定義約束。not null和default約束只能在列級(jí)上定義。如在department表定義主鍵約束:
create table department4(dept_id number(2) constraint pk_department primary key,// constraint指明約束,pk_employee表示自己定義的約束名 name varchar2(12), loc varchar2(12) );
2、表級(jí)定義
基本語(yǔ)法:
create table 表名(字段名 字段類型,...,constraint 約束名稱 約束條件(字段),約束條件(字段2),..);
表級(jí)定義是指在定義所有列后,再定義約束,這里需要注意。一般情況下,我們使用列級(jí)定義即可。但是如果遇到定義復(fù)合主鍵(兩列一起被定義為主鍵)時(shí),需要用到表級(jí)定義。 以在建立employee2表時(shí)定義主鍵約束和外鍵約束為例
create table employee2(emp_id number(4),name varchar2(15),dept_id number(2), constraint pk_employee primary key (emp_id),// constraint指明約束,pk_employee表示自己定義的約束名 constraint fk_department foreign key (dept_id) references department4(dept_id) );
三、約束維護(hù)
1、增加約束
如果在建表時(shí),忘記建立必要的約束,則可以在建表后使用alter table命令為表增加約束,但是要注意:增加not null約束時(shí),需要使用modify選項(xiàng),而增加其他四種約束使用add選項(xiàng)。
alter table goods modify goodsName not null alter table customer add constraint cardunique unique(cardID); ///add constraint表示增加約束,后面跟約束的名字 alter table customer add constraint addresscheck check (address in (‘海淀','朝陽(yáng)','東城','西城','通州','崇文'));
2、刪除約束:
當(dāng)不再需要某個(gè)約束時(shí),可以刪除。
alter table 表名 drop constraint 約束名稱;
特別說明一下:在刪除主鍵約束的時(shí)候,可能有錯(cuò)誤,比如:
alter table 表名 drop constraint primary key;
這是因?yàn)槿绻趦蓮埍泶嬖谥鲝年P(guān)系,那么在刪除主表的主鍵約束時(shí),必須帶上cascade選項(xiàng)。如像:
alter table 表名 drop constraint primary key cascade;
3、顯示約束信息
1)顯示約束信息
通過查詢數(shù)據(jù)字典視圖user_constraints,可以顯示當(dāng)前用戶所有的約束信息。
Select constraint_name,constraint_type,status,validated from user_constraints where table_name ='表名';
2)顯示約束列
通過查詢數(shù)據(jù)字典視圖user_cons_columns,可以顯示約束所對(duì)應(yīng)的表列信息
Select column_name,position from user_cons_columns where constraint_name='約束名';
4、改變約束狀態(tài)
ALTER TABLE xxx.yyy ENABLE|DISABLE VALIDATE|NOVALIDATE CONSTRAINT ccc;
5、重命名約束
ALTER TABLE xxx.yyy RENAME CONSTRAINT ccc TO ccc_new;
6、變更約束執(zhí)行時(shí)間(是否延緩執(zhí)行,只對(duì)可延緩約束有效)
SET CONSTRAINTS xxx IMMEDIATE; --立即 --或 SET CONSTRAINTS xxx DEFERRED; --延緩
到此這篇關(guān)于Oracle約束的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle SQL性能優(yōu)化系列學(xué)習(xí)二
Oracle SQL性能優(yōu)化系列學(xué)習(xí)二...2007-03-03詳解Oracle在out參數(shù)中訪問光標(biāo)
這篇文章主要介紹了詳解Oracle在out參數(shù)中訪問光標(biāo)的相關(guān)資料,這里提供實(shí)例代碼幫助大家學(xué)習(xí)理解這部分內(nèi)容,希望能幫助到大家,需要的朋友可以參考下2017-08-08oracle 11g導(dǎo)出數(shù)據(jù)時(shí)報(bào)ORA 1455錯(cuò)誤的處理方法
oracle 11g導(dǎo)出數(shù)據(jù)時(shí)報(bào)ORA 1455錯(cuò)誤,原因是由于導(dǎo)出的該用戶的表可能存在空數(shù)據(jù)表,下面是正確的導(dǎo)出步驟2014-08-08探討:Oracle數(shù)據(jù)庫(kù)查看一個(gè)進(jìn)程是如何執(zhí)行相關(guān)的實(shí)際SQL語(yǔ)句
本篇文章是對(duì)Oracle數(shù)據(jù)庫(kù)查看一個(gè)進(jìn)程是如何執(zhí)行相關(guān)的實(shí)際SQL語(yǔ)句進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05oracle 數(shù)據(jù)按主鍵刪除慢問題的解決方法
下面小編就為大家?guī)硪黄猳racle 數(shù)據(jù)按主鍵刪除慢問題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10Oracle創(chuàng)建設(shè)置查詢權(quán)限用戶的方法
這篇文章主要給大家介紹了關(guān)于Oracle創(chuàng)建設(shè)置查詢權(quán)限用戶的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Oracle具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08[Oracle] Data Guard CPU/PSU補(bǔ)丁安裝詳細(xì)教程
以下是對(duì)Data Guard CPU/PSU補(bǔ)丁安裝的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07