oracle-约束constraint

什么是约束

  • 约束是表级的强制规定
  • 有以下五种约束:
    • NOT NULL
    • UNIQUE
    • PRIMARY KEY
    • FOREIGN KEY
    • CHECK

注意事项

  • 如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
  • 创建和修改约束:
  • 建表的同时
  • 建表之后
    可以在表级列级定义约束
    可以通过数据字典视图查看约束

表级约束和列级约束

作用范围:

  1. 列级约束只能作用在一个列上
  2. 表级约束可以作用在多个列上(当然表级约束也可以作用在一个列上)
    定义方式:
    列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
    非空(not null) 约束只能定义在列上

定义约束

CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);

列级约束

column [CONSTRAINT constraint_name] constraint_type

表级约束

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

NOT 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);

可以在PL/SQLDEV的My objects-Tables-employees-Check constraints中查看

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,
    -- 可以声明在email后面:CONSTRAINT emp_email_uk UNIQUE,也可以如此末处声明。
    CONSTRAINT emp_email_uk 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 PRIMARY KEY(department_id) -- 表级约束
      );

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)
);

外键约束中的关键字

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

create table emp(
    id number(6) primary key,
    name varchar2(25) unique,
    sal number(8,2),
    dept_id number(4),
    constraint dept_fk foreign key(dept_id) references dept(dept_id) on delete cascade
);

CHECK 约束

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

create table emp(
    id number(6) primary key,
    name varchar2(25) 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 cascade
);

添加约束的语法

使用 ALTER TABLE 语句:

  • 添加或删除约束,但是不能修改约束
  • 有效化或无效化约束
  • 添加 NOT NULL 约束要使用 MODIFY 语句
ALTER TABLE	 表名
  ADD [CONSTRAINT 约束名 type (列名);
ALTER TABLE     employees
ADD CONSTRAINT  emp_manager_fk 
  FOREIGN KEY(manager_id) 
  REFERENCES employees(employee_id);

删除约束

从表 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;

当定义或激活UNIQUEPRIMARY KEY 约束时系统会自动创建UNIQUEPRIMARY KEY索引

查询约束

查询数据字典视图 USER_CONSTRAINTS

SELECT	constraint_name, constraint_type,
	search_condition
FROM	user_constraints
WHERE	table_name = 'EMPLOYEES';

在这里插入图片描述

查询定义约束的列

查询数据字典视图 USER_CONS_COLUMNS

SELECT	constraint_name, column_name
FROM	user_cons_columns
WHERE	table_name = 'EMPLOYEES';

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Java_Fly1/article/details/124721803