網站首頁 編程語言 正文
數(shù)據(jù)的完整性用于確保數(shù)據(jù)庫數(shù)據(jù)遵從一定的商業(yè)的邏輯規(guī)則。在oracle中,數(shù)據(jù)完整性可以使用約束、觸發(fā)器、應用程序(過程、函數(shù))三種方法來實現(xiàn),在這三種方法中,因為約束易于維護,并且具有最好的性能,所以作為維護數(shù)據(jù)完整性的首選。
一、什么是約束?
約束用于確保數(shù)據(jù)庫數(shù)據(jù)滿足特定的商業(yè)規(guī)則。
二、約束分類
1、not null(非空)
如果在列上定義了not null,那么當插入數(shù)據(jù)時,必須為列提供數(shù)據(jù)。
create table user1(id number,name varchar2(30) not null);
insert into user1 values(001,'');//會報錯
--ORA-01400: 無法將 NULL 插入 ("SCOTT"."USER1"."NAME")
2、default(默認)
插入null值時,提供默認值。
create table yg (編號 number ,姓名 varchar2(10), 基本工資 number(8,2) default 1000)
-- 默認值的插入方法
insert into yg values(1,'A',default);
insert into yg (編號,姓名)values(1,'A');
3、unique(唯一)
當定義了唯一約束后,該列值是不能重復的,但是可以為null。
create table user2(id number unique,name varchar2(30));
insert into user2 values(1,111);//id輸入重復的值是會報錯
--ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011172)
注意:oracle中unique可以為null,而且允許多行為null
4、primary key(主鍵)
用于唯一的標識表行的數(shù)據(jù),當定義主鍵約束后,該列不但不能重復,而且不能為null。需要說明的是:一張表最多只能有一個主鍵,但是可以有多個unique約束。
create table user3(id number primary key,name varchar2(30));
insert into user3 values(1,111);
insert into user3 values(1,111);//報錯,唯一性
--ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011173)
insert into user3 values(null,111);//報錯,不能為null
--ORA-01400: 無法將 NULL 插入 ("SCOTT"."USER3"."ID")
特別說明primary key與unique的區(qū)別:
- 一張表可以有多個unique(唯一)約束;
- 一張表只能有一個主鍵;
- 設置為主鍵的列不能有null值;
- primary key的所在列,會自動創(chuàng)建索引。但unique不會自動創(chuàng)建索引。
5、foreign key(外鍵):
用于定義主表和從表之間的關系,外鍵約束要定義在從表上,主表則必須具有主鍵約束或是unique約束,當定義外鍵約束后,要求外鍵列數(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外鍵的細節(jié)
- 外鍵指向主鍵列;
- 外鍵可以指向unique列;
- 建表時先建主表,再建從表;刪除表先刪從表,再刪主表。
- 外鍵列屬性值要與主鍵或unique列屬性值一致
- 外鍵列的值,必需在主鍵列中存在。但外鍵列的值允許為null
6、check(檢查)
用于強制行數(shù)據(jù)必須滿足某個條件,假定在sal列上定義了check約束,并要求sal列值在1000-2000之間,如果不再這個條件范圍內就會提示出錯。
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,報錯。
--ORA-02290: 違反檢查約束條件 (SCOTT.SYS_C0011178)
小貼士 : not null,default 只能在列內定義,其余四中約束都可以在表內定義。列內定義:就是指在創(chuàng)建表的時候創(chuàng)建列在‘,’之前所寫的。
二、列級定義與表級定義
1、列級定義
列級定義是在定義列的同時定義約束。not null和default約束只能在列級上定義。如在department表定義主鍵約束:
create table department4(dept_id number(2) constraint pk_department primary key,// constraint指明約束,pk_employee表示自己定義的約束名
name varchar2(12),
loc varchar2(12)
);
2、表級定義
基本語法:
create table 表名(字段名 字段類型,...,constraint 約束名稱 約束條件(字段),約束條件(字段2),..);
表級定義是指在定義所有列后,再定義約束,這里需要注意。一般情況下,我們使用列級定義即可。但是如果遇到定義復合主鍵(兩列一起被定義為主鍵)時,需要用到表級定義。?以在建立employee2表時定義主鍵約束和外鍵約束為例
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)
);
三、約束維護
1、增加約束
如果在建表時,忘記建立必要的約束,則可以在建表后使用alter table命令為表增加約束,但是要注意:增加not null約束時,需要使用modify選項,而增加其他四種約束使用add選項。
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 (‘海淀','朝陽','東城','西城','通州','崇文'));
2、刪除約束:
當不再需要某個約束時,可以刪除。
alter table 表名 drop constraint 約束名稱;
特別說明一下:在刪除主鍵約束的時候,可能有錯誤,比如:
alter table 表名 drop constraint primary key;
這是因為如果在兩張表存在主從關系,那么在刪除主表的主鍵約束時,必須帶上cascade選項。如像:
alter table 表名 drop constraint primary key cascade;
3、顯示約束信息
1)顯示約束信息
通過查詢數(shù)據(jù)字典視圖user_constraints,可以顯示當前用戶所有的約束信息。
Select constraint_name,constraint_type,status,validated from user_constraints where table_name ='表名';
2)顯示約束列
通過查詢數(shù)據(jù)字典視圖user_cons_columns,可以顯示約束所對應的表列信息
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í)行時間(是否延緩執(zhí)行,只對可延緩約束有效)
SET CONSTRAINTS xxx IMMEDIATE; --立即
--或
SET CONSTRAINTS xxx DEFERRED; --延緩
原文鏈接:https://www.cnblogs.com/springsnow/p/9394724.html
相關推薦
- 2022-06-25 React服務端渲染和同構的實現(xiàn)_React
- 2022-12-29 Android動態(tài)加載布局實現(xiàn)技巧介紹_Android
- 2023-07-03 git如何將遠程倉庫(upstream)新建分支(origin沒有)導入到自己fork的origin
- 2022-05-21 生產級K8S基礎環(huán)境部署配置流程_服務器其它
- 2022-03-26 C語言的字符函數(shù)和字符串函數(shù)詳解_C 語言
- 2023-04-29 Python腳本修改Maya?ASCII文件路徑方法實現(xiàn)_python
- 2022-07-18 RabbitMQ隊列阻塞該如何處理
- 2022-11-16 Python加載文件內容的兩種實現(xiàn)方式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支