Oracle数据库表约束

数据库表约束

数据库在设计表的时候,一定要为表设计约束,为了保证数据表中的数据是合法有效的数据。
表的约束是保证数据完整性的一种手段,在SQL语法之中约束一共分为六种:
1.数据类型约束
即:限制数据列存放数据的类型

2.非空约束(NOT NULL,NK(简称))

非空约束指的是要求数据表中的某个列的数据内容不允许为空null。
设置非空约束的语法:NOT NULL

CREATE TABLE test(
    mid NUMBER,
    name VARCHAR2(30) NOT NULL
);

3.唯一约束(UNIQUE,UK(简称))
唯一约束指的是 数据表中的某个列的数据不允许重复(除了null)。
的语法:UNIQUE

CREATE TABLE test(
    mid NUMBER,
    name VARCHAR2(30) NOT NULL,
    email VARCHAR2(50) UNIQUE
);

4.主键约束(PRIMARY KEY,PK(简称))
主键约束 = 唯一约束 + 非空约束,指的是 数据表中的某个列的数据不能为空null也不允许重复。
设置主键约束的语法一(约束对象自动生成):
CREATE TABLE test(
    mid NUMBER PRIMARY KEY,
    name VARCHAR2(30) NOT NULL
);
设置主键约束的语法二(自定义约束对象):
DROP TABLE test PURGE;
CREATE TABLE test(
    mid NUMBER,
    name VARCHAR2(30) NOT NULL,
     CONSTRAINT pk_test_mid PRIMARY KEY(mid) 
);

*正常情况下一张表只会设置一个主键。但是SQL语法支持在一张表中设置多个主键,多个主键之间用“,”逗号隔开。但一旦设置多个主键的表,必须满足多个列的数据完全相同才会触发约束条件。所以正常开发中我们几乎不会考虑使用多个主键设计!


5.检查约束(CHECK,CK(简称))

检查约束指的是在进行数据更新或添加操作的时候设置一些过滤条件。
例如:
在设置年龄的时候设置范围 0~120;
在设置性别的时候只能是 男或女;等...

设置主键约束的语法
DROP TABLE test PURGE;
CREATE TABLE test(
    mid NUMBER PRIMARY KEY,
    name VARCHAR2(30) NOT NULL,
    age NUMBER(3)
    CONSTRAINT ck_test_age CHECK(age BETWEEN 0 AND 120) 
);
-- 或
DROP TABLE test PURGE;
CREATE TABLE test(
    mid NUMBER PRIMARY KEY,
    name VARCHAR2(30) NOT NULL,
    sex VARCHAR2(4) CHECK(sex IN('男','女')) 
);
提示:实际上检查约束 就是在设置该属性值之前对其做一个 WHERE 条件判断。

6.外键约束(FOREIGN,FK(简称))

前提条件:
外键约束是建立在两张表的基础上,
例如:dept(部门)与emp(雇员)表。一个部门有多个雇员信息。那么此时dept称为主表,emp称为子表。

概念:
外键约束指的是限制子表中的某一个列的数据约束于主表的某一个数据列。
例如:有学生要进班听课,只能进入现在开班的班级。即:班级都不存在,怎么进入听课?
--班级表
CREATE TABLE class(
    cid NUMBER,-- 班级编号
    name VARCHAR2(30) NOT NULL,-- 班级名称
    CONSTRAINT pk_class_cid PRIMARY KEY(cid)  -- 班级编号主键
);

--学生表
CREATE TABLE student(
    sid NUMBER,-- 学生编号
    name VARCHAR2(30) NOT NULL,-- 学生姓名
      cid NUMBER , -- 班级编号
      CONSTRAINT pk_student_sid PRIMARY KEY(sid), -- 学生编号主键
    -- 设置未见外键约束
      CONSTRAINT fk_student_class_sid FOREIGN KEY(cid) REFERENCES class(cid) ON DELETE SET NULL
);

-- CONSTRAINT 约束名称 FOREIGN KEY(子表受约束列) REFERENCES 父表名称(父表被约束列)

正确示例:
INSERT INTO class(cid,name) VALUES (2,'java1702');

INSERT INTO student(sid,name,cid) VALUES (23,'A',2);
INSERT INTO student(sid,name,cid) VALUES (25,'B',2);

错误示例:
-- 在上诉正确的示例 数据中,继续执行该语句。
INSERT INTO student(sid,name,cid) VALUES (99,'C',10);-- 根本不存在 10班级

因为更新 子表数据的时候,会先检查 cid=10 的值 是否存在 父表的 cid列中。不存在,则出现 “未找到父项关键字”。字就是所谓的 外键约束(完整约束)。
外键约束的限制:
限制一:父表中作为子表关联的外键字段,必须设置为主键约束或者是唯一约束。
限制二:正常情况下:如果表中存在有外键关系,则:在删除父表前必须先删除子表,否则父表无法被删除。

强制删除约束表:(不到万不得已的不要使用此类操作)
DROP TABLE 表名 CASCADE CONSTRAINT;-- 被删除的表只能加入回收站
-- 因为该语法不能和强制删除表语法一起使用

-- DROP TABLE student PURGE; 只能二选一


限制三:正常情况下:如果表中存在关联数据,即:父表中的数据被子表中的数据关联。则:在删除父表数据之前必须先删除子表数据,否则父表的数据无法被删除。

如果父表的数据被很多张数据表关联,那么就需要在删除多张关联该数据的表的数据后才能删除父表的数据,此时的操作就很不方便了。我们可以通过配置数据的级联操作解决相关问题:


删除父表数据后相关的子表的数据也随之删除:
在外键约束后 加上语句:ON DELETE CASCADE

CONSTRAINT 约束名称 FOREIGN KEY(子表受约束列) REFERENCES 父表名称(父表被约束列) ON DELETE CASCADE


删除父表数据后相关的子表的数据约束列清空:
在外键约束后 加上语句:ON DELETE SET NULL

CONSTRAINT 约束名称 FOREIGN KEY(子表受约束列) REFERENCES 父表名称(父表被约束列) ON DELETE SET NULL


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值