oracle約束總結(not null/unique/primary key/foreign key/check),oracleunique
約束(constraint):對建立的表的列屬性、欄位進行的限制。諸如:not null/unique/primary key/foreign key/check
作用範圍:
①資料行層級條件約束只能作用在一個列上
②表級約束可以作用在多個列上(當然表級約束也可以作用在一個列上)
定義方式:列約束必須跟在列的定義後面,資料表條件約束不與列一起,而是單獨定義。
— —NOT NULL:不為空白約束,只能定義在列級
CREATE TABLE employees( employee_id NUMBER(6), --<span style="color:#FF0000;">系統命名</span> last_name VARCHAR2(25) <span style="color:#FF0000;">NOT NULL</span>, salary NUMBER(8,2), commission_pct NUMBER(2,2), --<span style="color:#FF0000;">使用者自訂命名</span> hire_date DATE <span style="color:#FF0000;">CONSTRAINT emp_hire_date_nn NOT NULL</span>,
可以在PL/SQLDEV的My objects-Tables-employees-Check constraints中查看該表的約束。
— —UNIQUE:唯一約束,可以定義在表級或列級
CREATE TABLE employees( employee_id NUMBER(6), --<span style="color:#FF0000;">列級,系統命名唯一約束</span> last_name VARCHAR2(25) <span style="color:#FF0000;">UNIQUE</span>, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... --<span style="color:#FF0000;">表級,使用者自訂命名唯一約束</span> CONSTRAINT <span style="color:#FF0000;">emp_email_uk</span> UNIQUE(email));
— —PRIMARY KEY :主鍵,可以定義在表級或列級
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 <span style="color:#FF0000;">PRIMARY KEY</span>(department_id));
— —FOREIGN KEY: 外鍵,在表級指定子表中的列
— —REFERENCES: 標示在父表中的列
— —ON DELETE CASCADE(串聯刪除): 當父表中的列被刪除時,子表中相對應的列也被刪除
— —ON DELETE SET NULL(級聯置空): 子表中相應的列置空
constraint emp1_dept_id_fk <span style="color:#FF0000;">foreign key</span>(dept_id) <span style="color:#FF0000;">references</span> departments(department_id) <span style="color:#FF0000;">ON DELETE CASCADE</span>
— —CHECK :定義每一行必須滿足的條件
..., salaryNUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),...
1.如何定義約束---在建立表的同時,添加對應屬性的約束
1.1 表級約束 & 資料行層級條件約束
create table emp1( employee_id number(8), salary number(8), --<span style="color:#FF0000;">資料行層級條件約束</span> hire_date date not null, dept_id number(8), email varchar2(8) constraint emp1_email_uk unique, name varchar2(8) constaint emp1_name_uu not null, first_name varchar2(8), --<span style="color:#FF0000;">表級約束</span> constraint emp1_emp_id_pk primary key(employee_id), constraint emp1_fir_name_uk unique(first_name), --<span style="color:#FF0000;">外鍵約束</span> constraint emp1_dept_id_fk foreign key(dept_id) <span style="color:#FF0000;">references</span> departments(department_id) ON DELETE CASCADE )
1.2 只有not null 只能使用資料行層級條件約束。其他的約束兩種方式皆可
2.添加和刪除表的約束--在建立表以後,只能添加和刪除,不能修改
2.1添加
alter table emp1 add constaint emp1_sal_ck check(salary > 0)
2.1.1對於not null來講,不用add,需要使用modify:
alter table emp1 modify (salary not null)
2.2 刪除
alter table emp1 drop constaint emp1_sal_ck
2.3使某一個約束失效:此約束還存在於表中,只是不起作用
alter table emp1
disable constraint emp1_email_uk;
2.4使某一個約束啟用:啟用以後,此約束具有約束力
alter table emp1 enable constraint emp1_email_uk;
為何oracle在定義主鍵的時,primary key 後面為何還要跟一個not null,primary key不就是要非空的
確實primary key等於unique key加上not null,但是說到底primary key也只是index裡邊的一種特殊的鍵,但並沒有規定說有primary的存在就不能有其他的了。是一種先入為主的想法 ,加上not null也不算錯
在sql server 2005中,unique、foreign key、primry key約束,check
qnique 唯一約束
foreign key 外鍵約束
primry key 主鍵約束