oracle中的約束
資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則。在oracle中,資料完整性是透過約束來實現的。在oracle中約束包括:not null , unique , primary key , foreign key , check 五種。
1.not null(非空)
如果在列上定義了not null,那麼當插入資料時,必須為列提供資料。
2.unique(唯一)
當定義了唯一約束之後,該列值是不能重複的,但是可以為null。
3.primary key(主鍵)
用於唯一的標誌行的資料,當定義主鍵約束之後,該列不但不能重複而且不能為null。一張表最多隻能有一個主鍵,但是可以有多個unique約束。
4.foreign key(外來鍵)
用於定義主表和從表之間的關係,外來鍵約束定義在從表上,主表則必須有主鍵約束或unique約束。當定義了外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或為null。
5.check
用於強制行資料必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間,如果不在1000-2000之間就會提示出錯。
約束定義語法:
約束表級定義是指在定義了所有列之後,在定義約束,這裡需要注意的是,not null約束只能在列級上定義。
create table goods(
goodsid char(8),goodsname varchar2(50),category varchar(30),
constraint PK_goodsid primary key(goodsid));
約束列級定義是在定義列的同時定義約束。
create table goods(
goodsid char(8) constraint PK_goodsid primary key,
goodsname varchar2(50),
unitprice number(10,2) check(unitprice>0),
category varchar(30),
provider varchar(100));
如果在建表時忘記建立必要的約束,則可在建表後使用alter table命令為表增加約束,但是要注意的是,增加not null約束時,需要使用modify選項,而增加其他四種約束使用add選項。
(1)增加商品名不能為空
alter table goods modify goodsid not null;
(2)增加身份證不能重複
alter table customers add constraint uq_cardid unique(cardid);
(3)增加客戶地址只能是a,b,c,d
alter table customers add constraint ck_address check(address in ('a','b','c','d'));
透過檢視動態效能檢視user_constraints可以顯示當前使用者所有的約束資訊:
GOODS@orcl 02-SEP-14>desc user_constraints
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
OWNER VARCHAR2(30)
CONSTRAINT_NAME NOT NULL VARCHAR2(30)
CONSTRAINT_TYPE VARCHAR2(1)
TABLE_NAME NOT NULL VARCHAR2(30)
SEARCH_CONDITION LONG
R_OWNER VARCHAR2(30)
R_CONSTRAINT_NAME VARCHAR2(30)
DELETE_RULE VARCHAR2(9)
STATUS VARCHAR2(8)
DEFERRABLE VARCHAR2(14)
DEFERRED VARCHAR2(9)
VALIDATED VARCHAR2(13)
GENERATED VARCHAR2(14)
BAD VARCHAR2(3)
RELY VARCHAR2(4)
LAST_CHANGE DATE
INDEX_OWNER VARCHAR2(30)
INDEX_NAME VARCHAR2(30)
INVALID VARCHAR2(7)
VIEW_RELATED VARCHAR2(14)
GOODS@orcl 02-SEP-14>col constraint_name for a20
GOODS@orcl 02-SEP-14>col table_name for a20
1.not null(非空)
如果在列上定義了not null,那麼當插入資料時,必須為列提供資料。
2.unique(唯一)
當定義了唯一約束之後,該列值是不能重複的,但是可以為null。
3.primary key(主鍵)
用於唯一的標誌行的資料,當定義主鍵約束之後,該列不但不能重複而且不能為null。一張表最多隻能有一個主鍵,但是可以有多個unique約束。
4.foreign key(外來鍵)
用於定義主表和從表之間的關係,外來鍵約束定義在從表上,主表則必須有主鍵約束或unique約束。當定義了外來鍵約束後,要求外來鍵列資料必須在主表的主鍵列存在或為null。
5.check
用於強制行資料必須滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間,如果不在1000-2000之間就會提示出錯。
約束定義語法:
約束表級定義是指在定義了所有列之後,在定義約束,這裡需要注意的是,not null約束只能在列級上定義。
create table goods(
goodsid char(8),goodsname varchar2(50),category varchar(30),
constraint PK_goodsid primary key(goodsid));
約束列級定義是在定義列的同時定義約束。
create table goods(
goodsid char(8) constraint PK_goodsid primary key,
goodsname varchar2(50),
unitprice number(10,2) check(unitprice>0),
category varchar(30),
provider varchar(100));
如果在建表時忘記建立必要的約束,則可在建表後使用alter table命令為表增加約束,但是要注意的是,增加not null約束時,需要使用modify選項,而增加其他四種約束使用add選項。
(1)增加商品名不能為空
alter table goods modify goodsid not null;
(2)增加身份證不能重複
alter table customers add constraint uq_cardid unique(cardid);
(3)增加客戶地址只能是a,b,c,d
alter table customers add constraint ck_address check(address in ('a','b','c','d'));
透過檢視動態效能檢視user_constraints可以顯示當前使用者所有的約束資訊:
GOODS@orcl 02-SEP-14>desc user_constraints
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
OWNER VARCHAR2(30)
CONSTRAINT_NAME NOT NULL VARCHAR2(30)
CONSTRAINT_TYPE VARCHAR2(1)
TABLE_NAME NOT NULL VARCHAR2(30)
SEARCH_CONDITION LONG
R_OWNER VARCHAR2(30)
R_CONSTRAINT_NAME VARCHAR2(30)
DELETE_RULE VARCHAR2(9)
STATUS VARCHAR2(8)
DEFERRABLE VARCHAR2(14)
DEFERRED VARCHAR2(9)
VALIDATED VARCHAR2(13)
GENERATED VARCHAR2(14)
BAD VARCHAR2(3)
RELY VARCHAR2(4)
LAST_CHANGE DATE
INDEX_OWNER VARCHAR2(30)
INDEX_NAME VARCHAR2(30)
INVALID VARCHAR2(7)
VIEW_RELATED VARCHAR2(14)
GOODS@orcl 02-SEP-14>col constraint_name for a20
GOODS@orcl 02-SEP-14>col table_name for a20
GOODS@orcl 02-SEP-14>select constraint_name,constraint_type,table_name
2 from user_constraints
3 where table_name in('GOODS','CUSTOMERS','PURCHASES');
CONSTRAINT_NAME C TABLE_NAME
-------------------- - --------------------
SYS_C0011122 C CUSTOMERS
SYS_C0011123 C CUSTOMERS
SYS_C0011124 P CUSTOMERS
SYS_C0011125 U CUSTOMERS
UQ_CARDID U CUSTOMERS
CK_ADDRESS C CUSTOMERS
SYS_C0011120 C GOODS
SYS_C0011121 P GOODS
SYS_C0011129 C GOODS
SYS_C0011126 C PURCHASES
SYS_C0011127 R PURCHASES
CONSTRAINT_NAME C TABLE_NAME
-------------------- - --------------------
FK001 R PURCHASES
可以透過user_cons_columns檢視約束的列表資訊:
GOODS@orcl 02-SEP-14>select column_name,constraint_name,table_name
2 from user_cons_columns
3 where constraint_name='CK_ADDRESS';
COLUMN_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CONSTRAINT_NAME TABLE_NAME
-------------------- --------------------
ADDRESS
CK_ADDRESS CUSTOMERS
如果不需要某個約束的話可以刪除:
GOODS@orcl 02-SEP-14>alter table customers drop constraint ck_address;
Table altered.
在刪除主鍵約束時,可能有如下錯誤:
GOODS@orcl 02-SEP-14>alter table goods drop primary key;
alter table goods drop primary key
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys
2 from user_constraints
3 where table_name in('GOODS','CUSTOMERS','PURCHASES');
CONSTRAINT_NAME C TABLE_NAME
-------------------- - --------------------
SYS_C0011122 C CUSTOMERS
SYS_C0011123 C CUSTOMERS
SYS_C0011124 P CUSTOMERS
SYS_C0011125 U CUSTOMERS
UQ_CARDID U CUSTOMERS
CK_ADDRESS C CUSTOMERS
SYS_C0011120 C GOODS
SYS_C0011121 P GOODS
SYS_C0011129 C GOODS
SYS_C0011126 C PURCHASES
SYS_C0011127 R PURCHASES
CONSTRAINT_NAME C TABLE_NAME
-------------------- - --------------------
FK001 R PURCHASES
可以透過user_cons_columns檢視約束的列表資訊:
2 from user_cons_columns
3 where constraint_name='CK_ADDRESS';
COLUMN_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CONSTRAINT_NAME TABLE_NAME
-------------------- --------------------
ADDRESS
CK_ADDRESS CUSTOMERS
如果不需要某個約束的話可以刪除:
GOODS@orcl 02-SEP-14>alter table customers drop constraint ck_address;
Table altered.
GOODS@orcl 02-SEP-14>alter table goods drop primary key;
alter table goods drop primary key
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys
這是因為如果在兩表存在主從關係,那麼在刪除主表主鍵約束的同時,必須加上cascade選項:
GOODS@orcl 02-SEP-14>alter table goods drop primary key cascade;
Table altered.
GOODS@orcl 02-SEP-14>alter table goods drop primary key cascade;
Table altered.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29800581/viewspace-1262622/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle約束Oracle
- oracle 約束Oracle
- 10、Oracle中的約 束constraintOracleAI
- Oracle唯一約束中NULL的處理OracleNull
- Oracle定義約束 外來鍵約束Oracle
- oracle的延遲約束Oracle
- Oracle中的約束簡單入門試驗Oracle
- Oracle外來鍵約束中NULL的處理OracleNull
- oracle 約束詳解Oracle
- Oracle約束簡介Oracle
- oracle鍵約束控制Oracle
- 修改oracle的約束欄位Oracle
- 如何在ORACLE中修改表的約束條件啊Oracle
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- oracle 註釋和約束Oracle
- 新增/刪除約束(Oracle)Oracle
- oracle 約束的novalidate 應用Oracle
- Oracle主鍵約束、唯一鍵約束、唯一索引的區別(轉)Oracle索引
- CHECK約束中的NULL條件Null
- oracle外來鍵約束的總結Oracle
- Oracle約束的學習與測試Oracle
- Oracle 11g系列:約束Oracle
- MySQL 中的約束及相關操作MySql
- Eclipse中引入spring的約束EclipseSpring
- React Native中的約束規範React Native
- MySQL中的 UNIQUE約束和UNIQUE索引MySql索引
- PHP中的型別約束介紹PHP型別
- Eclipse中引入MyBatis約束EclipseMyBatis
- Oracle資料庫中Constraint約束的四對屬性Oracle資料庫AI
- Oracle如何管理帶約束的B樹索引Oracle索引
- oracle約束學習經典案例Oracle
- oracle 約束 enable validate 檢查Oracle
- Javaweb-約束-外來鍵約束JavaWeb
- 建表時的約束的語法在informix和oracle中的差異ORMOracle
- Oracle constraints type 約束型別OracleAI型別
- Oracle基礎 11 約束 constraintsOracleAI
- oracle主外來鍵鎖_lock_約束Oracle
- Oracle 9i 約束條件(轉)Oracle