主要就是增加數據約束的。
Oracle中的約束簡(jiǎn)單介紹
約束 Including Constraints
在數據庫中使用約束(constraints)是為了在該數據庫中實(shí)施所謂的'業(yè)務(wù)規則'其實(shí)就是防止非法信息進(jìn)入數據庫,滿(mǎn)足管理員和應用開(kāi)發(fā)人員所定義的規則集.
ORACLE使用完整性約束(integrity constraints)防止不合法的數據寫(xiě)入數據庫,管理員和開(kāi)發(fā)人員可以定義完整性規則,增強商業(yè)規則,限制數據表中的數據.如果一個(gè)DML語(yǔ)句執行的任何結果破壞了完整性約束,ORACLE就會(huì )回滾語(yǔ)句,返回錯誤信息.
約束是通過(guò)使用CREATE TABLE或ALTER TABLE語(yǔ)句生成的.(建立表時(shí)或者表建立后修改都可)如果相關(guān)的約束定義在單列上,可以在列這一級指定約束的定義;多列約束必須定義在數據表級,相關(guān)的列要在括號中指定,用逗號分隔.如果沒(méi)有為約束提供一個(gè)名字,那么ORACLE會(huì )分配一個(gè)系統生成的唯一名字,以SYS_開(kāi)頭,你可以使用關(guān)鍵字CONSTRAINTS后面跟隨相關(guān)的約束名字來(lái)為約束指定名字.
ORACLE支持五種類(lèi)型的完整性約束
NOT NULL (非空)--防止NULL值進(jìn)入指定的列,在單列基礎上定義,默認情況下,ORACLE允許在任何列中有NULL值.
CHECK (檢查)--檢查在約束中指定的條件是否得到了滿(mǎn)足.
UNIQUE (唯一)--保證在指定的列中沒(méi)有重復值.在該表中每一個(gè)值或者每一組值都將是唯一的.
PRIMARY KEY (主鍵)--用來(lái)唯一的標識出表的每一行,并且防止出現NULL值,一個(gè)表只能有一個(gè)主鍵約束.
POREIGN KEY (外部鍵)--通過(guò)使用公共列在表之間建立一種父子(parent-child)關(guān)系,在表上定義的外部鍵可以指向主鍵或者其他表的唯一鍵.
以下幾種約束 、并 一一列舉:
1.主鍵約束:
要對一個(gè)列加主鍵約束的話(huà),這列就必須要滿(mǎn)足的條件就是分空
因為主鍵約束:就是對一個(gè)列進(jìn)行了約束,約束為(非空、不重復)
以下是代碼 要對一個(gè)列加主鍵,列名為id,表名為emp
格式為:
alter table 表格名稱(chēng) add constraint 約束名稱(chēng) 增加的約束類(lèi)型 (列名)
例子:
alter table emp add constraint ppp primary key (id)
————————————————————————————————
2.check約束:
就是給一列的數據進(jìn)行了限制
比方說(shuō),年齡列的數據都要大于20的
表名(emp) 列名(age)
格式:
alter table 表名稱(chēng) add constraint 約束名稱(chēng) 增加的約束類(lèi)型 (列名)
例子:
alter table emp add constraint xxx check(age>20)
______________________________________________________________________
3.unique約束:
這樣的約束就是給列的數據追加的不重復的約束類(lèi)型
格式:
alter table 表名 add constraint 約束名稱(chēng) 約束類(lèi)型(列名)
比方說(shuō)可以給ename列加個(gè)unique,讓ename列的數據不重復
例子:
alter table emp add constraint qwe unique(ename)
————————————————————————————————
4.默認約束:
意思很簡(jiǎn)單就是讓此列的數據默認為一定的數據
格式:
alter table 表名稱(chēng) add constraint 約束名稱(chēng) 約束類(lèi)型 默認值) for 列名
比方說(shuō):emp表中的gongzi列默認為10000
alter table emp add constraint jfsd default 10000 for gongzi
————————————————————————————————
5.外鍵約束:
這個(gè)有點(diǎn)難理解了,外鍵其實(shí)就是引用
因為主鍵實(shí)現了實(shí)體的完整性,
外鍵實(shí)現了引用的完整性,
應用完整性規定,所引用的數據必須存在!
其實(shí)就是個(gè)引用,
比方說(shuō)一個(gè)表名稱(chēng)叫dept 里面有2列數據 一列是ID一列是ENAME
id:表示產(chǎn)品的編號
ename:表示產(chǎn)品的名稱(chēng)
另外一個(gè)表格名稱(chēng)是emp 里面有2列數據,一列是ID 一列是DID
id:表示用戶(hù)號
did:表示購買(mǎi)的產(chǎn)品號
要讓emp表中的did列去引用dept表中的id
可以用下面的方法
格式:
alter table 表名 add constraint 約束名稱(chēng) 約束類(lèi)型 (列名) references 被引用的表名稱(chēng) (列名)
例子:
alter table emp add constraint jfkdsj foreign key (did) references dept (id)
約束定義存儲在數據字典中,查詢(xún)USER_CONSTRAINTS可以獲得相關(guān)信息.
定義約束
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);
e.g.
CREATE TABLE employees
(employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINTS emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));
列級的約束定義
column [CONSTRAINT constraint_name] constraint_type,
表級約束的定義
column,..
[CONSTRAINT constraint_name] constraint_type (column,...)
NOT NULL約束
只能定義在列級,不能定義在表級.
e.g.
CREATE TABLE employees
(employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL, //沒(méi)有指定名字,將用系統SYS_命名
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL); //用戶(hù)定義了名字
UNIQUE約束
用來(lái)保護一個(gè)表中的一個(gè)或者多個(gè)列沒(méi)有任何兩行在收到保護的列中具有重復的數據.ORACLE在唯一鍵列上自動(dòng)生成一個(gè)唯一索引以實(shí)現唯一性
e.g.
CREATE TABLE employees
(employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
CONSTRAINT emp_email_uk UNIQUE(email));
PRIMARY KEY約束
唯一鍵的所有特征都適用于主鍵約束,只是在主鍵列中不允許有NULL值.一個(gè)表只能有一個(gè)主鍵.
e.g.
CREATE TABLE departments
(department_id NUMBER(4),
department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL,
manager_id NUMBER(6),
location_id NUMBER(4),
CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
FOREIGN KEY 約束
用來(lái)保護一個(gè)表中的一個(gè)或者多個(gè)列,它會(huì )通過(guò)一個(gè)主鍵主鍵或者唯一鍵保證對于每個(gè)非NULL值在數據庫的其他地方都有一個(gè)數據可用.這個(gè)外部鍵就是在生成此約束的表(子表)中的一個(gè)或多個(gè)列,在父級表和子表中,相關(guān)列的數據類(lèi)型必須匹配.外部鍵列和引用鍵(reference key)列可以位于相同的表中(自引用完整性約束).
e.g.
CREATE TABLE employees
(employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
deparment_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY(department_id) REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));
上例中是在表級定義外部鍵約束,如果在列級定義,不同的是:
CREATE TABLE employees
(...,
department_id NUMBER(4) CONSTRAINT emp_deptid_fk REFERENCES departments(department_id),
...);
//沒(méi)有關(guān)鍵字FOREIGN KEY
FOREIGN KEY約束還有兩個(gè)關(guān)鍵字是
ON DELETE CASCADE --當刪除所引用的父表記錄時(shí),刪除子表中相關(guān)的記錄
ON DELETE SET NULL--與上面不同的是刪除時(shí),轉換子表中相關(guān)記錄為NULL值
默認情況下,如果沒(méi)有指定以上兩個(gè)中任一,則父表中被引用的記錄將不能被刪除.
CHECK 約束
[CONSTRAINT <constraint name>] CHECK (<condition>
這里CHECK子句中的CONDITION應該求值為一個(gè)布爾值結果,并且可以引用相同行中其他列的值;不能包含子查詢(xún),序列,環(huán)境函數(SYSDATE,UID,USER,USERENV)和偽列(ROWNUM,LEVEL,CURRVAL,NEXTVAL),一個(gè)列上可以定義多個(gè)CHECK約束,如果所定義的條件為FALSE,則語(yǔ)句將回滾.
CREATE TABLE employees
(...,
salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary>0),
...);
添加約束
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);
刪除約束
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
ALTER TABLE departments
DROP PRIMARY KEY CASCADE; //由于departments被employees.department_id引用了
對于NOT NULL約束,用ALTER TABLE MODIFY子句來(lái)刪除
ALTER TABLE employees MODIFY last_name NULL;
關(guān)閉約束
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk CASCADE; //如果沒(méi)有被引用則不需CASCADE關(guān)鍵字
當你生成一個(gè)約束時(shí),約束自動(dòng)打開(kāi)(除非你指定了DISABLE子句0,當用DISABLE關(guān)閉UNIQUE或者PRIMARY KEY約束時(shí),ORACLE會(huì )自動(dòng)刪除相關(guān)的唯一索引,再次打開(kāi)時(shí),ORACLE又會(huì )自動(dòng)建立的.
打開(kāi)約束
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk; //注意,打開(kāi)一個(gè)先前關(guān)閉的被引用的主鍵約束,并不能自動(dòng)打開(kāi)相關(guān)的外部鍵約束
可以從USER_CONSTRAINTS表和USER_CONS_COLUMNS視圖中查詢(xún)約束的信息
SELECT constraint_name,constraint_type,search_condition
FROM user_constraints
WHERE table_name='EMPLOYEES';
約束類(lèi)型
C--CHECK和NOT NULL都算為C TYPE
P--PRIMARY KEY
R--REFERENTIAL INTEGRITY就是外部鍵約束
U--UNIQUE
SELECT constraint_name,column_name
FROM user_cons_columns
WHERE table_name='EMPLOYEES';
聯(lián)系客服