[Oracle数据库学习]十、约束

D6

什么是约束

约束是表级的强制规定,放置在表中删除有关联关系的数据。

可以在表级或列级定义约束;
可以通过数据字典视图查看约束。

约束的类型

NOT NULL:非空
UNIQUE:唯一
PRIMARY KEY:主键
FOREIGN KEY:外键
CHECK:检查

 

约束的命名

如果不指定约束名,Oracle Server自动按照SYS_Cn的格式指定约束名

 

约束的创建时间

1)建表的同时
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)
    );

注:job_id列的约束,employees表的主键约束

 

列级

column [CONSTRAINT constraint_name] constraint_type,

 

表级

column,...
    [CONSTRAINT constraint_name] constraint_type
    (column, ...),

 

NOT NULL约束

保证列值不能为空,且只能定义在列级。

create table employees
(
  employee_id int,
  employee_name char(100),
  department_id int,
  job_id varchar2(100) NOT NULL,
  salary float,
  commission_pct float,
  hire_date date
    CONSTRAINT emp_hire_date_nn NOT NULL,
  description char(255),
  manager_id int
);

注:job_id处非空约束采用系统命名,hire_date处用户命名。

 

UNIQUE约束

定义在列级

employee_name唯一性约束:

create table employees
(
  employee_id int,
  employee_name char(100)
    CONSTRAINT emp_employee_name_uk UNIQUE,
  department_id int,
  job_id varchar2(100) NOT NULL,
  salary float,
  commission_pct float,
  hire_date date
    CONSTRAINT emp_hire_date_nn NOT NULL,
  description char(255),
  manager_id int
);

 

定义在表级

create table employees
(
  employee_id int,
  employee_name char(100),
  department_id int,
  job_id varchar2(100) NOT NULL,
  salary float,
  commission_pct float,
  hire_date date
    CONSTRAINT emp_hire_date_nn NOT NULL,
  description char(255),
  manager_id int,
  CONSTRAINT emp_employee_name_uk UNIQUE(employee_name)
);

 

PRIMARY KEY约束

定义在列级

create table departments
(
  department_id int PRIMARY KEY,
  department_name varchar2(300),
  location_id int
);

 

定义在表级

create table departments
(
  department_id int,
  department_name varchar2(300),
  location_id int,
  CONSTRAINT dept_id_pk PRIMARY KEY(department_id)
);

 

FOREIGN KEY约束

定义在列级

create table employees
(
  employee_id int,
  employee_name char(100),
  department_id int REFERENCES departments(department_id),
  job_id varchar2(100) NOT NULL,
  salary float,
  commission_pct float,
  hire_date date CONSTRAINT emp_hire_date_nn NOT NULL,
  description char(255),
  manager_id int,
  CONSTRAINT emp_employee_name_uk UNIQUE(employee_name)
);

 

定义在表级

create table employees
(
  employee_id int,
  employee_name char(100),
  department_id int,
  job_id varchar2(100) NOT NULL,
  salary float,
  commission_pct float,
  hire_date date CONSTRAINT emp_hire_date_nn NOT NULL,
  description char(255),
  manager_id int,
  CONSTRAINT emp_employee_name_uk UNIQUE(employee_name),
  CONSTRAINT emp_department_id_fk FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

 

FOREIGN KEY约束的关键字

FOREIGN KEY:在表级指定子表中的列;
REFERENCES:标示在父表中的列;
ON DELETE CASCADE:当父表中的列被删除时,子表中相对应的列也被删除;
ON DELETE SET NULL:当父表中的列被删除时,子表中相应的列置空。

 

CHECK约束

定义每一行必须满足的条件。

以下的表达式是不允许的:
1)出现CURRVAL, NEXTVAL, LEVEL和ROWNUM伪列;
2)使用SYSDATE, UID, USER和USERENV函数;
3)在查询中涉及到其它列的值。

create table employees
(
  employee_id int,
  employee_name char(100),
  department_id int,
  job_id varchar2(100) NOT NULL,
  salary float CONSTRAINT emp_salary_min CHECK (salary > 0),
  commission_pct float,
  hire_date date CONSTRAINT emp_hire_date_nn NOT NULL,
  description char(255),
  manager_id int,
  CONSTRAINT emp_employee_name_uk UNIQUE(employee_name),
  CONSTRAINT emp_department_id_fk FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

注:salary列的check约束:emp_salary_min 

 

ALTER TABLE添加约束

使用ALTER TABLE语句:

添加或删除约束, 但是不能修改约束;
有效化或无效化约束;
添加NOT NULL约束要使用MODIFY语句。

 

添加约束

ALTER TABLE table
ADD [CONSTRAINT constraint] type (column);

 

ALTER TABLE employees
ADD CONSTRAINT emp_manager_fk 
FOREIGN KEY(manager_id) REFERENCES employees(employee_id);

 

删除约束

删除约束

ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;

 

使用CASCADE选项删除约束

ALTER TABLE departments
DROP PRIMARY KEY CASCADE;

 

无效化约束

在ALTER TABLE语句中使用DISABLE子句将约束无效化。

ALTER TABLE employees
DISABLE CONSTRAINT emp_employee_id_pk;

 

可以使用CASCADE选项将相关的约束也无效化。

ALTER TABLE employees
DISABLE CONSTRAINT emp_employee_id_pk CASCADE;

 

激活约束

使用ENABLE子句可将当前无效的约束激活。

ALTER TABLE employees
ENABLE CONSTRAINT emp_employee_id_pk;

当定义或激活UNIQUE或PRIMARY KEY约束时,系统会自动创建UNIQUE或PRIMARY KEY索引。

 

级联约束

在DROP COLUMN子句中使用CASCADE CONSTRAINTS子句:
1)在删除表的列时,CASCADE CONSTRAINTS子句指定将相关的约束一起删除;
2)在删除表的列时,CASCADE CONSTRAINTS子句同时也删除多列约束。

ALTER TABLE test1 
DROP (pk) CASCADE CONSTRAINTS;

 

查询约束

查询约束

查询数据字典视图USER_CONSTRAINTS。

SELECT constraint_name, constraint_type,search_condition
FROM user_constraints
WHERE table_name = 'EMPLOYEES';
CONSTRAINT_NAMECONSTRAINT_TYPESEARCH_CONDITION
SYS_C006996 C "JOB_ID" IS NOT NULL
EMP_HIRE_DATE_NN C "HIRE_DATE" IS NOT NULL
SYS_C006998 P (null)
EMP_EMPLOYEE_NAME_UK U (null)
EMP_DEPARTMENT_ID_FK R (null)

 

查询定义约束的列

查询数据字典视图USER_CONS_COLUMNS。

SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';
CONSTRAINT_NAMECOLUMN_NAME
SYS_C006998 JOB_ID
EMP_HIRE_DATE_NN HIRE_DATE
EMP_EMPLOYEE_NAME_UK EMPLOYEE_NAME
EMP_DEPARTMENT_ID_FK DEPARTMENT_ID

 

总结:

本节介绍约束相关内容:

1)约束类型:NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK;

2)创建约束:CREATE TABLE、ALTER TABLE;

3)ALTER TABLE时:ADD、DROP、ENABLE、DISABLE;

4)级联约束:CASCADE CONSTRAINTS子句;

5)查询约束:USER_CONSTRAINTS(约束)、USER_CONS_COLUMNS(定义了约束的列)。

 

posted @ 2020-07-16 17:16  workingdiary  阅读(195)  评论(0)    收藏  举报