首页 > 数据库 >10、Oracle中的约 束constraint

10、Oracle中的约 束constraint

时间:2024-07-14 12:08:35浏览次数:6  
标签:10 constraint CONSTRAINT 约束 EMP Oracle id emp

最近项目要用到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   |

标签:10,constraint,CONSTRAINT,约束,EMP,Oracle,id,emp
From: https://www.cnblogs.com/huageyiyangdewo/p/18300326

相关文章

  • css设置弹性flex后,如果设置100vh高度不撑满的原因
    问题父元素设置height为100%,有两个子元素,第一个设置height:100vh,第二个设置flex:1,此时第一个高度无法撑满盒子原因+解决方式当父元素设置display为flex,第一个div设置高度64px,剩一个div设置高度为flex:1,这时候肯定两个子元素同高。但是如果此时设置第一个div的高度为100......
  • P10765 「CROI · R2」在相思树下 I
    P10765「CROI·R2」在相思树下I-洛谷|计算机科学教育新生态(luogu.com.cn)挺简单一题,看看规律即可。#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;typedeflonglongLL;constintN=70;LLn,m;intg[N];intmain()......
  • P10678 『STA - R6』月
    P10678『STA-R6』月-洛谷|计算机科学教育新生态(luogu.com.cn)挺意外的一个题,从黄色到蓝色。贪心思想比较好想,尽量把度数多的连在一起。这样会形成一个中心聚集的图,就可以使得最长直径尽量小。#include<iostream>#include<cstring>#include<algorithm>usingnam......
  • P10679 『STA - R6』spec
    P10679『STA-R6』spec-洛谷|计算机科学教育新生态(luogu.com.cn)一个小题,我们知道如果\(na=b\)则有\(b-1<na\leb\),而对于此题,\(1\)一定满足题意但不一定为最大。于是,对于每个x都有一个n,使得\(x-1<na\lex\),我们只需要这样列式子,然后找到最大的全部......
  • 前端学习-flutter学习-010-按钮
    《Flutter实战·第二版》ElevatedButton(child:Text("ElevatedButton默认带有阴影和灰色背景。按下后,阴影会变大"),onPressed:(){},),TextButton(child:Text("TextButton默认背景透明并不带阴影。按下后,会有背景色"),onPressed:(){},),......
  • 电力系统——基于10机39节点的电力系统仿真(Matlab)
    目录1引言2 案例仿真 2.1负荷参数 2.2线路、变压器参数2.3发电机参数2.4励磁参数 310机39节点的仿真 3.1建立Simulink模型3.2 MATLAB程序实现 3.3运行结果 3.4结果分析4总结 5Simulink&Matlab实现1引言   目前,随着科学技术的发......
  • 在Linux中,如何编写shell脚本将当前目录下大于10K的文件转移到/tmp目录下?
    编写一个shell脚本来将当前目录下大于10K的文件转移到/tmp目录下,你可以遵循以下步骤:打开你的Linux终端。使用文本编辑器创建一个新的shell脚本文件,例如使用nano或vim:nanomove_large_files.sh在打开的编辑器中,编写以下脚本内容:#!/bin/bash#定义目标目录TARGET_DIR......
  • Windows10下的docker容器启动命令docker -v相对路径的挂载目录位置
    今天研究docker容器时,启动命令使用到了docker-vtest:/app/backend/data有个从宿主机写入文件到容器这个目录的需求,于是就尝试在宿主机上找到这个test目录找了一圈都没找到,于是四处搜索,终于在stackoverflow上面找到了https://stackoverflow.com/questions/61083772/where-are-......
  • 【题解】洛谷 P10765 「CROI · R2」在相思树下 I
    I题意简述共\(T\)组测试数据。对于每一组测试数据,有初始数列,共\(n\)个元素,从\(1\)至\(n\)。给出\(k\)次操作。操作一:将数列中下标为奇数的数全部删除;操作二:将数列中下标为偶数的数全部删除。完成操作之后,将剩余的数从下标\(1\)开始依次重新编排下标。求问\(k\)次......
  • [20240618]Oracle C functions annotations.txt
    [20240618]OracleCfunctionsannotations.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/FritsHoog......