oracle——05資料完整性
oracle——05資料完整性
資料完整性:
資料完整性用以確保資料庫資料遵從一定的商業和邏輯規則。在Oracle中,資料完整性可以使用約束、觸發器、應用程式(過程和函式)三種方法來實現,這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。
約束
約束用以確保資料庫資料滿足特地的商業規則。在Oracle中,約束包括:
not null :非空
如果在列上定義了not null,那麼插入資料時必須為該列提供資料,否則插不進去。
unique :唯一
當定義了唯一約束以後,該列值是不能重複的,但是可以為null
primary key :主鍵
用於唯一的標識錶行的資料,當定義主鍵約束後,該列不但不能重複而且不能為null
說明:一張表最多隻能有一個主鍵,但是可以有多個unique約束。
聯合主鍵:多列聯合起來作為主鍵。
foreign key :外來鍵
用於定義主表和從表之間的關係,外來鍵約束要定義在從表上,主表則必須有主鍵約束或unique約束,當定義外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或是為null
check :檢查
用於強制行資料必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間,如果不在此區間內就提示錯誤。
案例分析
--建立商品表
create table goods(
goodsId char(8) primary key,--主鍵
goodsName varchar2(30),
unitPrice number(10,2) check(unitPrice>0),--單價大於0
category varchar2(8),
provider varchar2(30) );
--建立客戶表
create table customer(
customerId char(8) primary key, -- 主鍵
name varchar2(50) not null,
address varchar2(50),
email varchar(50) unique --email不能重複
sex char(2) default '男' check (sex in('男','女')),
cardId char(18) );
--購買purchase
create table purchase(
customerId char(8) reference customer(customerId), --外來鍵
goodsId char(8) reference goods(goodsId), --外來鍵
nums number(100) check(nums between 1 and 30) –數量
);
如果建表時忘記建立必要的約束,則可以在建表後使用alter table命令為表增加約束。但是要注意:增加not null約束時,需要使用modify選項,而增加其他4種約束使用add選項。
--增加商品名也不能為空
alter table goods modify goodsName not null;
--增加身份證也不能重複
alter table customer add constraint cardUnique unique cardId;
--增加客戶的住址只能是"海淀","朝陽","東城","西城","通州","崇文"
alter table customer add constraint addresschek check(address in (''海淀,'朝陽','東城','西城','通州','崇文'));
刪除約束
alter table 表明 drop constraint 約束名
特別說明:
在刪除主鍵約束的時候可能有錯誤,比如:
alter table xxx drop primary key;
這是因為如果2張表之間存在主從關係,那麼在刪除主表的主鍵約束時,必須帶上cascade選項,如:
alter table xxx drop primary key cascade;
顯示約束資訊
1)顯示約束資訊
通過查詢資料字典檢視user_constraints,可以顯示當前使用者的所有約束資訊。
select constraint_name,constraint_type,status,validated from user_constraint where table_name='表名';
2)顯示約束列
通過查詢資料字典檢視user_cons_columns,可以顯示約束所對應的表的列的資訊。
select column_name,position from user_cons_columns where constraint_name='約束名';
3)更容易的辦法,直接用pl/sql developer檢視即可。
列級定義
列級定義是指在定義列的同時定義定義約束。
如在department表定義主鍵約束
create table department(
deptId number(4) constraint pk_department primary key,--主鍵
name varchar2(8),
loc varchar2(20)
);
說明:在列級定義時,加不加constraint pk_department都是可以的,區別是不加的話,系統會自動分配一個主鍵約束名稱,可讀性差。
表級定義
表級定義是指在定義了所有列後,再定義約束。需要注意:not null只能在列級上定義。
以在建立employee2表時定義主鍵約束和外來鍵約束為例:
create table employee2(
empId number(4),
name varchar2(20),
loc varchar2(40),
constraint pk_employee primary key(empId),
constraint fk_department foreign key(deptId) references department(deptId)
);
oracle資料完整性參照完整性域完整性
資料的完整性就是指資料庫中的資料在邏輯上的一致性和準確性。資料完整性一般分為3種:域完整性、實體完整性和參照完整性。完整性約束是通過限制列資料、行資料和表之間的資料來保證資料的完整性。完整性約束定義在表上,儲存在資料字典中。
1、域完整性
域完整性又稱列完整性,是指確定一個資料集對某一列是否有效和確定是否允許空值。域完整性通常是通過使用有效性檢查來實現的,還可以通過限制資料型別、格式或者可能的取值範圍來實現。
Oracle可以通過check約束實現域完整性。check約束表示一個欄位的輸入必須滿足check約束的條件,若不滿足,則資料無法正常輸入。
利用SQL語句操作check約束主要有如下幾種方式:
(1)利用SQL語句在建立表時建立check約束
Sql程式碼
create table tableName(
columnName dataType [not null | null] [default expression] check(checkExpression),
columnName dataType [not null | null] [default expression] constraint checkName check(checkExpression),
...n
)
示例程式碼:
Sql程式碼
create table person(
id int primary key,
sex varchar(4) check(sex='男' or sex='女'),
age int default 0 constraint ageCheck check(age>=0 and age<=125)
)
(2)利用SQL語句在修改時建立check約束
Sql程式碼
alter table tableName add(constraint checkName check(checkExpression), columnName dataType check(checkExpression))
示例程式碼:
Sql程式碼
alter table person add(constraint sexCheck check(sex='男' or sex='女'), age int check(age>=0 and age<=125))
(3)利用SQL語句刪除check約束
Sql程式碼
alter table tableName drop constraint checkName;
示例程式碼:
Sql程式碼
alter table person drop constraint sexCheck;
2、實體完整性
實體完整性又稱行完整性,它有求表中的每一行都有一個唯一的識別符號,這個識別符號就是主關鍵字。通過索引、unique約束和primary key約束可以實現實體完整性。
為表建立主鍵可實現表的實體完整性,主鍵可以是一列或幾列的組合,一個表只能有一個primary key約束,且primary key約束中的列不能為空值,當為表建立primary key時,Oracle會自動為primary key對應的列建立唯一索引,實現資料的唯一性。有了索引後,就可以實現對資料的快速訪問。
如果要確保一個表中的非主鍵列的值不可重複,可以在該列加上unique約束,unique約束也會自動產生索引。
primary key約束和unique約束的區別如下:
(1)一個資料表只能有一個primary key約束,但可以有多個unique約束。
(2)primary key對應欄位的值不能為null,而unique約束對應列的值可以為null。
(3)primary key對應欄位或欄位的組合的值是不能重複的,而unique約束列的值為null的時候是可以重複的,也就是說unique約束列可以有多個null值。
利用SQL建立和刪除primary key約束和unique約束
(1)在建立表的時候建立對應的約束
Sql程式碼
create table tableName(columnName dataType primary key, columnName dataType unique,...n);
create table tableName(columnName1 dataType, columnName2 dataType, ...n, primary key(columnName1, columnName2), unique(columnName3, columnName4));
示例程式碼:
Sql程式碼
create table person(id int primary key, name varchar(20) unique, age int);
create table person(id int, name varchar(20), age int, primary key(id), unique(name));
(2)在修改表的時候建立對應的約束
Sql程式碼
alter table tableName add(constraint pkName primary key(column1, column2), constraint uniqueName unique(column3, column4));
示例程式碼:
Sql程式碼
alter table person add(constraint personPk primary key(id), constraint nameUnique unique(name));
(3)刪除primary key和unique約束
Sql程式碼
alter table tableName drop constraint constraintName;
示例程式碼:
Sql程式碼
alter table person drop constraint personPk;
3、參照完整性
參照完整性又稱為引用完整性,它可以保證從表(參照表)中的資料與主表(被參照表)中的資料的一致性。參照完整性通過定義從表的外來鍵與主表的主鍵相對應來實現。可以利用foreign key定義從表中的外來鍵,利用primary key定義主表中的主鍵。
--如果主表中的一條記錄被從表中的外來鍵所引用,那麼主表的這一條記錄既不能被刪除也不能修改主關鍵字。
--如果從表的外來鍵沒有進行not null約束,那麼從表的外來鍵也是可以為null的。
利用SQL語句定義和刪除表間的參照關係
(1)建立表時同時定義表間的參照關係
Sql程式碼
create table tableName(columnName dataType [foreign key] references referencesTableName(referencesColumn),...n);
--referencesTableName表示參照表的表名,referencesColumn表示參照的參照表中的欄位名,即參照的是參照表中的哪個欄位。
示例程式碼:
Sql程式碼
create table saleBill(id int primary key, saleBookBillId int references saleBookBill(id));
--該程式碼表示saleBill表中的saleBookBillId欄位是參照saleBookBill表的id欄位。
(2)通過修改表定義外來鍵約束
Sql程式碼
alter table tableName add(constraint constraintName foreign key(column1[, column2, ...n]) references refTableName(refColumn1[, refColumn2, ...n]));
示例程式碼:
Sql程式碼
alter table saleBill add(constraint saleBillFk foreign key(saleBookBillId) references saleBookBIll(id));
(3)利用SQL語句刪除表間的參照關係
Sql程式碼
alter table tableName drop constraint constraintName;
示例程式碼:
Sql程式碼
alter table saleBill drop constraint saleBillFk;
資料完整性:
資料完整性用以確保資料庫資料遵從一定的商業和邏輯規則。在Oracle中,資料完整性可以使用約束、觸發器、應用程式(過程和函式)三種方法來實現,這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。
約束
約束用以確保資料庫資料滿足特地的商業規則。在Oracle中,約束包括:
not null :非空
如果在列上定義了not null,那麼插入資料時必須為該列提供資料,否則插不進去。
unique :唯一
當定義了唯一約束以後,該列值是不能重複的,但是可以為null
primary key :主鍵
用於唯一的標識錶行的資料,當定義主鍵約束後,該列不但不能重複而且不能為null
說明:一張表最多隻能有一個主鍵,但是可以有多個unique約束。
聯合主鍵:多列聯合起來作為主鍵。
foreign key :外來鍵
用於定義主表和從表之間的關係,外來鍵約束要定義在從表上,主表則必須有主鍵約束或unique約束,當定義外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或是為null
check :檢查
用於強制行資料必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間,如果不在此區間內就提示錯誤。
案例分析
--建立商品表
create table goods(
goodsId char(8) primary key,--主鍵
goodsName varchar2(30),
unitPrice number(10,2) check(unitPrice>0),--單價大於0
category varchar2(8),
provider varchar2(30) );
--建立客戶表
create table customer(
customerId char(8) primary key, -- 主鍵
name varchar2(50) not null,
address varchar2(50),
email varchar(50) unique --email不能重複
sex char(2) default '男' check (sex in('男','女')),
cardId char(18) );
--購買purchase
create table purchase(
customerId char(8) reference customer(customerId), --外來鍵
goodsId char(8) reference goods(goodsId), --外來鍵
nums number(100) check(nums between 1 and 30) –數量
);
如果建表時忘記建立必要的約束,則可以在建表後使用alter table命令為表增加約束。但是要注意:增加not null約束時,需要使用modify選項,而增加其他4種約束使用add選項。
--增加商品名也不能為空
alter table goods modify goodsName not null;
--增加身份證也不能重複
alter table customer add constraint cardUnique unique cardId;
--增加客戶的住址只能是"海淀","朝陽","東城","西城","通州","崇文"
alter table customer add constraint addresschek check(address in (''海淀,'朝陽','東城','西城','通州','崇文'));
刪除約束
alter table 表明 drop constraint 約束名
特別說明:
在刪除主鍵約束的時候可能有錯誤,比如:
alter table xxx drop primary key;
這是因為如果2張表之間存在主從關係,那麼在刪除主表的主鍵約束時,必須帶上cascade選項,如:
alter table xxx drop primary key cascade;
顯示約束資訊
1)顯示約束資訊
通過查詢資料字典檢視user_constraints,可以顯示當前使用者的所有約束資訊。
select constraint_name,constraint_type,status,validated from user_constraint where table_name='表名';
2)顯示約束列
通過查詢資料字典檢視user_cons_columns,可以顯示約束所對應的表的列的資訊。
select column_name,position from user_cons_columns where constraint_name='約束名';
3)更容易的辦法,直接用pl/sql developer檢視即可。
列級定義
列級定義是指在定義列的同時定義定義約束。
如在department表定義主鍵約束
create table department(
deptId number(4) constraint pk_department primary key,--主鍵
name varchar2(8),
loc varchar2(20)
);
說明:在列級定義時,加不加constraint pk_department都是可以的,區別是不加的話,系統會自動分配一個主鍵約束名稱,可讀性差。
表級定義
表級定義是指在定義了所有列後,再定義約束。需要注意:not null只能在列級上定義。
以在建立employee2表時定義主鍵約束和外來鍵約束為例:
create table employee2(
empId number(4),
name varchar2(20),
loc varchar2(40),
constraint pk_employee primary key(empId),
constraint fk_department foreign key(deptId) references department(deptId)
);
oracle資料完整性參照完整性域完整性
資料的完整性就是指資料庫中的資料在邏輯上的一致性和準確性。資料完整性一般分為3種:域完整性、實體完整性和參照完整性。完整性約束是通過限制列資料、行資料和表之間的資料來保證資料的完整性。完整性約束定義在表上,儲存在資料字典中。
1、域完整性
域完整性又稱列完整性,是指確定一個資料集對某一列是否有效和確定是否允許空值。域完整性通常是通過使用有效性檢查來實現的,還可以通過限制資料型別、格式或者可能的取值範圍來實現。
Oracle可以通過check約束實現域完整性。check約束表示一個欄位的輸入必須滿足check約束的條件,若不滿足,則資料無法正常輸入。
利用SQL語句操作check約束主要有如下幾種方式:
(1)利用SQL語句在建立表時建立check約束
Sql程式碼
create table tableName(
columnName dataType [not null | null] [default expression] check(checkExpression),
columnName dataType [not null | null] [default expression] constraint checkName check(checkExpression),
...n
)
示例程式碼:
Sql程式碼
create table person(
id int primary key,
sex varchar(4) check(sex='男' or sex='女'),
age int default 0 constraint ageCheck check(age>=0 and age<=125)
)
(2)利用SQL語句在修改時建立check約束
Sql程式碼
alter table tableName add(constraint checkName check(checkExpression), columnName dataType check(checkExpression))
示例程式碼:
Sql程式碼
alter table person add(constraint sexCheck check(sex='男' or sex='女'), age int check(age>=0 and age<=125))
(3)利用SQL語句刪除check約束
Sql程式碼
alter table tableName drop constraint checkName;
示例程式碼:
Sql程式碼
alter table person drop constraint sexCheck;
2、實體完整性
實體完整性又稱行完整性,它有求表中的每一行都有一個唯一的識別符號,這個識別符號就是主關鍵字。通過索引、unique約束和primary key約束可以實現實體完整性。
為表建立主鍵可實現表的實體完整性,主鍵可以是一列或幾列的組合,一個表只能有一個primary key約束,且primary key約束中的列不能為空值,當為表建立primary key時,Oracle會自動為primary key對應的列建立唯一索引,實現資料的唯一性。有了索引後,就可以實現對資料的快速訪問。
如果要確保一個表中的非主鍵列的值不可重複,可以在該列加上unique約束,unique約束也會自動產生索引。
primary key約束和unique約束的區別如下:
(1)一個資料表只能有一個primary key約束,但可以有多個unique約束。
(2)primary key對應欄位的值不能為null,而unique約束對應列的值可以為null。
(3)primary key對應欄位或欄位的組合的值是不能重複的,而unique約束列的值為null的時候是可以重複的,也就是說unique約束列可以有多個null值。
利用SQL建立和刪除primary key約束和unique約束
(1)在建立表的時候建立對應的約束
Sql程式碼
create table tableName(columnName dataType primary key, columnName dataType unique,...n);
create table tableName(columnName1 dataType, columnName2 dataType, ...n, primary key(columnName1, columnName2), unique(columnName3, columnName4));
示例程式碼:
Sql程式碼
create table person(id int primary key, name varchar(20) unique, age int);
create table person(id int, name varchar(20), age int, primary key(id), unique(name));
(2)在修改表的時候建立對應的約束
Sql程式碼
alter table tableName add(constraint pkName primary key(column1, column2), constraint uniqueName unique(column3, column4));
示例程式碼:
Sql程式碼
alter table person add(constraint personPk primary key(id), constraint nameUnique unique(name));
(3)刪除primary key和unique約束
Sql程式碼
alter table tableName drop constraint constraintName;
示例程式碼:
Sql程式碼
alter table person drop constraint personPk;
3、參照完整性
參照完整性又稱為引用完整性,它可以保證從表(參照表)中的資料與主表(被參照表)中的資料的一致性。參照完整性通過定義從表的外來鍵與主表的主鍵相對應來實現。可以利用foreign key定義從表中的外來鍵,利用primary key定義主表中的主鍵。
--如果主表中的一條記錄被從表中的外來鍵所引用,那麼主表的這一條記錄既不能被刪除也不能修改主關鍵字。
--如果從表的外來鍵沒有進行not null約束,那麼從表的外來鍵也是可以為null的。
利用SQL語句定義和刪除表間的參照關係
(1)建立表時同時定義表間的參照關係
Sql程式碼
create table tableName(columnName dataType [foreign key] references referencesTableName(referencesColumn),...n);
--referencesTableName表示參照表的表名,referencesColumn表示參照的參照表中的欄位名,即參照的是參照表中的哪個欄位。
示例程式碼:
Sql程式碼
create table saleBill(id int primary key, saleBookBillId int references saleBookBill(id));
--該程式碼表示saleBill表中的saleBookBillId欄位是參照saleBookBill表的id欄位。
(2)通過修改表定義外來鍵約束
Sql程式碼
alter table tableName add(constraint constraintName foreign key(column1[, column2, ...n]) references refTableName(refColumn1[, refColumn2, ...n]));
示例程式碼:
Sql程式碼
alter table saleBill add(constraint saleBillFk foreign key(saleBookBillId) references saleBookBIll(id));
(3)利用SQL語句刪除表間的參照關係
Sql程式碼
alter table tableName drop constraint constraintName;
示例程式碼:
Sql程式碼
alter table saleBill drop constraint saleBillFk;
相關文章
- 原創 oracle 資料完整性總結Oracle
- Oracle資料庫開發——表(資料完整性約束)Oracle資料庫
- 資料完整性
- 資料庫完整性資料庫
- 資料庫 資料庫的完整性資料庫
- 循序漸進講解Oracle資料庫的完整性概念Oracle資料庫
- 資料庫完整性+T-SQL資料庫SQL
- 資料庫第五章資料庫完整性資料庫
- 雜湊函式與資料完整性 (^=◕ᴥ◕=^)函式
- 從 "垃圾 "資料到資料完整性的轉變
- 05-資料型別資料型別
- SHA演算法:資料完整性的守護者演算法
- day05 資料型別資料型別
- 資料庫架構和物件、定義資料完整性-SQL Server資料庫架構物件SQLServer
- oracle基礎練習11-15章 索引維護、資料庫完整性等Oracle索引資料庫
- 資料庫應用系統中的資料庫完整性(上)KP資料庫
- 讀資料湖倉05資料需要的層次
- 來玩Play框架05 資料庫框架資料庫
- concepts閱讀總結11——資料庫安全與資料完整性資料庫
- 資料庫系統之實體完整性約束資料庫
- mysql~資料完整性考慮~外來鍵約束MySql
- SQL語言與資料庫完整性和安全性SQL資料庫
- SQL SERVER 2005中的資料參照完整性SQLServer
- [求助][資料庫]表間約束的刪除完整性?資料庫
- 區塊鏈真的能保證資料的完整性嗎? - Bozho區塊鏈
- 區塊鏈和大資料一起能否開啟資料完整性的新紀元?區塊鏈大資料
- 小熊飛槳練習冊-05水果資料集
- 2024-05-10 js資料型別JS資料型別
- Oracle recover後如何檢測檔案的完整性Oracle
- Oracle OCP(05):轉換函式Oracle函式
- 05 Javascript資料結構與演算法 之 樹JavaScript資料結構演算法
- Oracle實驗(05):時間型別Oracle型別
- 《JavaScript高階程式設計》學習筆記(表單和資料完整性)JavaScript程式設計筆記
- mysql:使用樂觀鎖保護資料一致性和完整性MySql
- 讀資料質量管理:資料可靠性與資料質量問題解決之道05資料標準化
- 《資料安全能力成熟度模型》實踐指南05:資料傳輸加密模型加密
- HDFS 05 - HDFS 的後設資料管理(FSImage、EditLog、Checkpoint)
- 尚矽谷大資料Hadoop(22)P80-P84DataNode工作機制,資料完整性,服役新資料節點,退役舊資料節點,大資料Hadoop