最近專案要用到Oracle,奈何之前沒有使用過,所以在B站上面找了一個學習影片,用於記錄學習過程以及自己的思考。
影片連結:
【尚矽谷】Oracle資料庫全套教程,oracle從安裝到實戰應用
如果有侵權,請聯絡刪除,謝謝。
學習目標:
-
描述約束
-
建立和維護約束
1、什麼是約束
約束是表級的強制規定
有以下五種約束:
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
注意事項
-
如果不指定約束名 ,Oracle server 自動按照 SYS_Cn 的格式指定約束名
-
建立和修改約束:
- 建表的同時
- 建表之後
-
可以在表級或列級定義約束
-
可以透過資料字典檢視檢視約束
1.1、表級約束和列級約束
作用範圍:
①列級約束只能作用在一個列上
②表級約束可以作用在多個列上(當然表級約束也可以作用在一個列上)
定義方式: 列約束必須跟在列的定義後面,表約束不與列一起,而是單獨定義。
非空(not null) 約束只能定義在列上
2、定義約束
格式:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);
示例:
CREATE TABLE employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));
列級
column [CONSTRAINT constraint_name] constraint_type,
表級
column,...
[CONSTRAINT constraint_name] constraint_type
(column, ...),
3、NOT NULL 約束
保證列值不能為空:
只能定義在列級:
DBeaver 透過下面方式檢視:選中檢視的表 -> 屬性 -> 約束 即可檢視。
4、UNIQUE 約束
唯一約束,允許出現多個空值: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)); -- 使用者自定義命名
可以宣告在email後面:CONSTRAINT emp_email_uk UNIQUE,也可以如此末處宣告。
5、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 PRIMARY KEY(department_id)); -- 定義主鍵
6、FOREIGN 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));
6.1、FOREIGN KEY 約束的關鍵字
- FOREIGN KEY: 在表級指定子表中的列
- REFERENCES: 標示在父表中的列
- ON DELETE CASCADE: 級聯刪除。當父表中的列被刪除時,子表中相對應的列也被刪除
- ON DELETE SET NULL: 級聯置空。子表中相應的列置空
create table emp (
id number(10) primary key,
name varchar2(26) unique,
sal number(8, 2),
dept_id number(4),
constraint dept_fk foreign key(dept_id) references dept(dept_id) on delete cascade
);
7、CHECK 約束
定義每一行必須滿足的條件
..., salary NUMBER(2)
CONSTRAINT emp_salary_min
CHECK (salary > 0),...
示例:
create table emp (
id number(10) primary key,
name varchar2(26) unique,
sal number(8, 2) check(sal > 0 and sal < 1000000),
dept_id number(4),
constraint dept_fk foreign key(dept_id) references dept(dept_id) on delete set null
);
8、新增約束的語法
使用 ALTER TABLE 語句:
- 新增或刪除約束,但是不能修改約束
- 有效化或無效化約束
新增 NOT NULL 約束要使用 MODIFY 語句
ALTER TABLE table
ADD [CONSTRAINT constraint] type (column);
以create table emp as select * from employees;為例,新增和刪除約束
alter table emp modify(empname varchar2(50) not null);
8.1、新增約束
新增約束舉例
ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk
FOREIGN KEY(manager_id)
REFERENCES employees(employee_id);
Table altered.
8.2、刪除約束
從表 EMPLOYEES 中刪除約束
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
Table altered.
8.3、無效化約束
在ALTER TABLE 語句中使用 DISABLE 子句將約束無效化。
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk;
Table altered.
8.4、啟用約束
- ENABLE 子句可將當前無效的約束啟用
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk;
Table altered.
當定義或啟用UNIQUE 或 PRIMARY KEY 約束時系統會自動建立UNIQUE 或 PRIMARY KEY索引
8.5、查詢約束
查詢資料字典檢視 USER_CONSTRAINTS
SELECT constraint_name, constraint_type,
search_condition
FROM user_constraints
WHERE table_name = 'EMPLOYEES';
結果:
CONSTRAINT_NAME |CONSTRAINT_TYPE|SEARCH_CONDITION |
----------------+---------------+-----------------------+
EMP_LAST_NAME_NN|C |"LAST_NAME" IS NOT NULL|
EMP_EMAIL_NN |C |"EMAIL" IS NOT NULL |
EMP_HIRE_DATE_NN|C |"HIRE_DATE" IS NOT NULL|
EMP_JOB_NN |C |"JOB_ID" IS NOT NULL |
EMP_SALARY_MIN |C |salary > 0 |
EMP_EMAIL_UK |U | |
EMP_EMP_ID_PK |P | |
EMP_DEPT_FK |R | |
EMP_JOB_FK |R | |
EMP_MANAGER_FK |R | |
8.6、查詢定義約束的列
查詢資料字典檢視 USER_CONS_COLUMNS
SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';
結果:
CONSTRAINT_NAME |COLUMN_NAME |
----------------+-------------+
EMP_LAST_NAME_NN|LAST_NAME |
EMP_EMAIL_NN |EMAIL |
EMP_HIRE_DATE_NN|HIRE_DATE |
EMP_JOB_NN |JOB_ID |
EMP_SALARY_MIN |SALARY |
EMP_EMAIL_UK |EMAIL |
EMP_EMP_ID_PK |EMPLOYEE_ID |
EMP_DEPT_FK |DEPARTMENT_ID|
EMP_JOB_FK |JOB_ID |
EMP_MANAGER_FK |MANAGER_ID |