学习要求

有一定关系型数据的操作功底,会SQL语句

教学目标

熟练掌握Oracle数据库表设计中列的设计

约束定义

约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称)。

约束功能

约束的功能:实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。

约束分类

数据库约束有6种:

  • 非空约束(NOT NULL)

  • 唯一性约束(UNIQUE)

  • 主键约束(PRIMARY KEY)

  • 外键约束(FOREIGN KEY)

  • 检查约束(CHECK)

  • REF约束(REF)[不讲]

约束命名规范

非空约束     NN_表名_列名
唯一约束     UK_表名_列名
主键约束     PK_表名
外键约束     FK_表名_列名
条件约束     CK_表名_列名
默认约束     DF_表名_列名

非空约束(NOT NULL)

非空约束(NOT NULL):顾名思义,所约束的列不能为NULL值。否则就会报错

操作方式1:建表时,明确指定列非空

-- 建表
create table T_TEST(ID NUMBER,NAME VARCHAR2(10) NOT NULL
);
-- 添加空值测试
insert into t_test(id, name) values(1, null);

操作方式2:使用alter 方式添加

-- 删表,再建表
drop table T_TEST;-- 此时表name字段并没有非空约束
create table T_TEST(ID NUMBER,NAME VARCHAR2(10)
);
-- 添加非空约束
alter table t_test modify name VARCHAR2(10) not null;
-- 添加空值测试
-- ORA-01400: 无法将 NULL 插入 ("SCOTT"."T_TEST"."NAME")
insert into t_test(id, name) values(1, null);

操作方式3:PL/SQL developer 可视化创建

手动指定约束名,约束类型primary,约束的列

外键约束(FOREIGN KEY)

外键约束(FOREIGN KEY):用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性.

操作方式1:建表时,明确指定外键列

-- 建表
create table T_TEST4(ID NUMBER,DEPTNO NUMBER,CONSTRAINT FK_TEST_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
);
-- 插入数据,外键引向部门的编号
select deptno form dept;  -- 查看部门编号
insert into t_test4(id, deptno) values(1, 10);   -- 部门表10编号存在-- ORA-02291: 违反完整约束条件 (SCOTT.FK_TEST_DEPTNO) - 未找到父项关键字
insert into t_test4(id, deptno) values(1, 100);  -- 部门表100编号不存在

操作方式2:使用alter 方式添加

-- 删表,再建表
drop table T_TEST4;-- 此时表id字段并没有唯一约束
create table T_TEST4(ID NUMBER,DEPTNO NUMBER
);
-- 添加外键
alter table t_test4 add constraint FK_TEST_DEPTNO foreign key(DEPTNO) REFERENCES DEPT(DEPTNO);-- 插入数据,外键引向部门的编号
select deptno form dept;  -- 查看部门编号
insert into t_test4(id, deptno) values(1, 10);   -- 部门表10编号存在-- ORA-02291: 违反完整约束条件 (SCOTT.FK_TEST_DEPTNO) - 未找到父项关键字
insert into t_test4(id, deptno) values(1, 100);  -- 部门表100编号不存在

操作方式3:PL/SQL developer 可视化创建

手动指定约束名,约束类型foreign,约束的列,参照表DEPT,参照列DEPTNO

注意:外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。

条件约束(CHECK)

条件约束(CHECK):条件约束可用来实施一些简单的规则,比如列值必须在某个范围内

操作方式1:建表时,明确指定外键列

-- 建表
create table T_TEST5(ID NUMBER,SEX VARCHAR2(10),CONSTRAINT SEX_CHECK CHECK (SEX IN ('man', 'woman'))
);
-- 插入数据
insert into t_test5(id, sex) values(1, 'man');   -- 符合 IN ('man', 'woman') 条件
-- ORA-02290: 违反检查约束条件 (SCOTT.SEX_CHECK)
insert into t_test5(id, sex) values(1, 'dafei'); -- 不符合IN ('man', 'woman') 条件

操作方式2:使用alter 方式添加

-- 删表,再建表
drop table T_TEST5;-- 此时表id字段并没有唯一约束
create table T_TEST5(ID NUMBER,SEX VARCHAR2(10)
);
-- 添加外键
alter table t_test5 add constraint SEX_CHECK check (SEX IN ('man', 'woman'));-- 插入数据
insert into t_test5(id, sex) values(1, 'man');   -- 符合 IN ('man', 'woman') 条件
-- ORA-02290: 违反检查约束条件 (SCOTT.SEX_CHECK)
insert into t_test5(id, sex) values(1, 'dafei'); -- 不符合IN ('man', 'woman') 条件

操作方式3:PL/SQL developer 可视化创建

手动指定name跟条件

REF约束(REF)

官方给定义:不理解,不讲

REF约束的定义:REF column by definition references an object in another object type or in a relational table. A REF constraint lets you further describe the relationship between the REF column and the object it references.

约束操作

禁用约束

ALTER TABLE 表名 DISABLE CONSTRAINT 约束名

启用约束

ALTER TABLE 表名 ENABLE CONSTRAINT 约束名

删除约束

ALTER TABLE 表名 DROP CONSTRAINT 约束名

开发建议

很多书本跟大厂都建议除了Primary key 主键之外都不加其他相关约束,数据的安全都交给客户端维护(比如:java程序校验等)。我个人持有的看法,如果不是高并发,大数据类型的项目,建议还是加上相关约束。目的:防菜鸟,提高数据安全性,合法性。

Oracle19C入门到熟练013-列约束相关推荐

  1. Oracle19C入门到熟练016-数据备份与恢复

    学习要求 有一定关系型数据的操作功底,会SQL语句 教学目标 熟练掌握Oracle数据库的数据备份与恢复 备份 概念 备份就是把数据库复制到转储设备的过程.其中,转储设备是指用于放置数据库副本的磁带或 ...

  2. matlab z变换离散化_MATLAB作图从入门到熟练

    有同学说,靠网络上的文章,很难学到系统的知识,还得自己看书,这话不假.主要是因为网上文章篇幅过短,难免无法概括全面,加之同学们更关心一些高效的学习方法,更倾向于接受高密集信息的学习方式,节省时间和精力 ...

  3. .Net Redis 入门到熟练

    内存缓存主要有两种,一种是应用服务自己的memcache,类似于 webapi的session 其实都是服务自己的应用级内存,另外一种是分布式的缓存服务,此服务在另外的机器上,耗费的都是此机器的内存资 ...

  4. linux内核二当家,Linux PWN从入门到熟练(二)

    前言 上回说到,如何利用程序中system函数以及bin/sh字符串来进行pwn.这里我们会介绍,如何在栈可执行而system函数以及参数没有的情况下,如何自己布置payload进行pwn.此外,还提 ...

  5. 【github干货】主流深度学习开源框架从入门到熟练

    文章首发于微信公众号<有三AI> [github干货]主流深度学习开源框架从入门到熟练 今天送上有三AI学院第一个github项目 01项目背景 目前深度学习框架呈百家争鸣之态势,光是为人 ...

  6. Linux PWN从入门到熟练

    最近在复习pwn的一些知识.主要涉及到当堆栈开启了保护的时候,我们不能够直接将shellcode覆盖到堆栈中执行,而需要利用程序其他部分的可执行的小片段来连接成最终的shellcode.此小片段就是g ...

  7. RESTful从入门到熟练,看完这篇就够了

    学习要求 良好的java基础, 熟悉SpringBoot框架,熟悉SpringMVC框架 教学目标 掌握RESTful接口设计 视频教程 5小时带你入门到熟练RESTful接口设计 铺垫 先说明,本篇 ...

  8. 2. 表的操作:创建表、修改表、列约束和表约束、数据操作、删除表

    文章目录 表的操作 1. 表的创建[CREATE TABLE 表名] 2. 使用T-SQL语句修改表(修改列的属性.增加列.删除列) 3. 列约束和表约束 4. 表数据操作(insert.update ...

  9. 【MySQL】DDL语句详解:列类型、列约束及自增列_Unit03

    文章目录 一.计算机如何存储字符 1. 如何存储英文字符 2. 如何存储中文字符 3. 解决mysql中文乱码 二.列类型 1. 数值型--引号可加可不加 2. 日期时间型--必须加引号 3. 字符串 ...

最新文章

  1. 【BZOJ】2120: 数颜色
  2. asp.net访问被拒绝,程序集无法加载原因与解决方法[摘录]
  3. 理解Windows中的路由表和默认网关
  4. CoreLink CCI-550的概念介绍
  5. boost::mp11::mp_bind_q相关用法的测试程序
  6. CSS做个Switch开关
  7. 洛谷 P2853 [USACO06DEC]Cow Picnic S-dfs
  8. IDEA 搭建 SpringBoot + Maven + Oracle + Hibernate 项目框架
  9. 【Kafka】kafka 根据 ConsumerOffsetChecker获取group当前消费情况
  10. 如何使用 Java 调取 Python、R 的训练模型?
  11. error: invalid new-expression of abstract class type 'Rectangle'
  12. Java版本微信授权登录(概览版)
  13. 建网站域名服务器那个好,如何选择好建网站的域名?
  14. easyboot-code-generate 自动生成代码
  15. 一个vector内容赋值给另一个vector
  16. 图形学篇:多边形有效边表填充算法
  17. Oracle 如何删除控制文件中rman备份到磁带的备份集信息(RMAN-06091)
  18. 家门口的微醺“buff”——酒分之一开启社区酒吧式便利店次元
  19. 有了这个sku分析!老板再也不用担心我不会选款备货了
  20. Openvino学习之openvino2022.1版安装配置

热门文章

  1. 项目生命周期及其主要工作
  2. 钢厂计算机应用岗位做什么的,钢铁厂计算机应用与节能
  3. 技术篇丨音频监控应用现状分析
  4. [2014.5.13][Ubuntu] Ubuntu 14.04STL 出现NTFS分区无法访问的问题
  5. 关于使用 FLAG_HOMEKEY_DISPATCHED 标志在应用层截获 HOME 按键的说明
  6. MySQL可更新视图
  7. iosiPhone屏幕尺寸、分辨率及适配
  8. 主流CTR预估模型的演化及对比
  9. Django QuerySet浅析
  10. perspective 和 transform-style 区别