第九章 約束
1.什麼是約束
約束是表級的強制規定
有以下五種約束:NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK
2.注意事項
如果不指定約束名 ,Oracle server 自動按照 SYS_Cn 的格式指定約束名
創建和修改約束:
建表的同時
建表之後
可以在表級或列級定義約束
可以通過數據字典視圖查看約束
3.表級約束和列級約束
作用範圍:
①列級約束只能作用在一個列上
②表級約束可以作用在多個列上(當然表級約束也
可以作用在一個列上)
定義方式:列約束必須跟在列的定義後面,表約束不與列一起,而是單獨定義。
非空(not null) 約束只能定義在列上
4.定義約束
4.1NOT NULL 約束 只能定義在列級:
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
CONSTRAINT emp_hire_date_nn
NOT NULL,
...
4.2UNIQUE 約束 唯一約束,允許出現多個空值:NULL。
可以定義在表級或列級:
CREATE TABLE employees(
employee_id NUMBER(6),
last_name VARCHAR2(25) UNIQUE,
email VARCHAR2(25),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
...
CONSTRAINT emp_email_uk UNIQUE(email));
4.3PRIMARY 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 PRIMARY KEY(department_id));
4.4FOREIGN KEY 約束 可以定義在表級或列級:
CREATE TABLE employees(
employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
...
department_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));
FOREIGN KEY 約束的關鍵字:
FOREIGN KEY: 在表級指定子表中的列
REFERENCES: 標示在父表中的列
ON DELETE CASCADE(級聯刪除): 當父表中的列被刪除時,子表中相對應的列也被刪除
ON DELETE SET NULL(級聯置空): 子表中相應的列置空
4.5CHECK 約束 定義每一行必須滿足的條件
..., salary NUMBER(2)
CONSTRAINT emp_salary_min
CHECK (salary > 0),...
5.添加約束的語法
使用 ALTER TABLE 語句:
添加或刪除約束,但是不能修改約束
有效化或無效化約束
添加 NOT NULL 約束要使用 MODIFY 語句
以create table emp as select * from employees;爲例,添加和刪除約束
Alter table emp modify(empname varchar2(50) not null);
添加約束舉例
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk
FOREIGN KEY(manager_id)
REFERENCES employees(employee_id);
Table altered.
從表 EMPLOYEES 中刪除約束
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
無效化約束:在ALTER TABLE 語句中使用 DISABLE 子句將約束無效化。
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk;
激活約束:ENABLE 子句可將當前無效的約束激活
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk;