oracle数据库表的约束constraints
表的数据有一定的取值范围和联系,多表之间的数据有时也有一定的参照关系。
在创建表和修改表时,可通过定义约束条件来保证数据的完整性和一致性。
约束条件是一些规则,在对数据进行插入、删除和修改时要对这些规则进行验证,从而起到约束作用。2.完整性约束分类
域完整性约束(非空not null,检查check)
实体完整性约束(唯一unique,主键primary key)
参照完整性约束(外键foreign key)
3.约束类型 说明
主键约束(Primary Key)
唯一约束(Unique)要求主键列数据唯一,并且不允许为空。主键可以包含表的一列或多列,如果包含表的多列,则需要在表级定义
要求该列唯一,允许为空
检查约束(Check)
某列取值范围限制、格式限制等,如年龄的约束
非空约束(not null)
某类内容不能为空
外键约束(Foreign Key)
用于两表间建立关系,需要指定引用主表的那列。外键通常用来约束两个表之间的数据关系,定义外键的那张表称为子表,另一张表称为主表。
在表的创建过程中,应该先创建主表,后创建子表。
4.三种完整性约束的区别
域完整性约束:字段约束
实体完整性约束:行和行之间的约束
引用完整性约束:表和表之间的约束
5.创建约束的时机
在建表的同时创建
建表后创建
6.约束从作用上分类,可以分成两大类:
表级约束:可以约束表中的任意一列或多列。可以定义除了Not Null以外的任何约束。
列级约束:只能约束其所在的某一列。可以定义任何约束。
7.命名规则推荐采用:约束类型_约束字段
非空约束 NN_表名_列名
唯一约束 UK_表名_列名
主键约束 PK_表名
外键约束 FK_表名_列名
检查约束 CK_表名_列名
8.主键约束
主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。
主键从功能上看相当于非空且唯一
一个表中只允许一个主键
主键是表中能够唯一确定一个行数据的字段
主键字段可以是单字段或者是多字段的组合
Oracle为主键创建对应的唯一性索引
--【主键约束】:唯一约束+非空约束
CREATE TABLE STUDENT(
SNO NUMBER(6) CONSTRAINTS PK_STUDENT PRIMARY KEY,--列级别约束
SNAME VARCHAR2(20)
);
CREATE TABLE STUDENT(
SNO NUMBER(6) PRIMARY KEY,--简写方式,主键名称会自动生成
SNAME VARCHAR2(20)
);
CREATE TABLE STUDENT(
SNO NUMBER(6) ,
SNAME VARCHAR2(20),
CONSTRAINTS PK_STUDENT PRIMARY KEY(SNO)--表级别约束
);
--联合主键
--联合主键不能设置列级别约束
CREATE TABLE STUDENT(
SNO NUMBER(6),
SNAME VARCHAR2(20),
CONSTRAINTS PK_STUDENT PRIMARY KEY(SNO,SNAME)--表级别约束
);
9.非空约束
确保字段值不允许为空
只能在字段级定义
--【非空约束】 not null
--学生姓名不能为空
--非空约束只能设置列级别的约束
CREATE TABLE STUDENT(
SNO NUMBER(6),
SNAME VARCHAR2(20) CONSTRAINTS NN_STUDENT_SNAME NOT NULL,--非空约束
);
CREATE TABLE STUDENT(
SNO NUMBER(6),
SNAME VARCHAR2(20) NOT NULL,--非空约束,简写方式
);
10.唯一性约束
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现空值,且可以多个空值
Oracle将为唯一性约束条件创建对应的唯一性索引
--【唯一约束】
--设置邮箱唯一,不能重复
--唯一约束可以设置null值,并且可以重复插入多个null值
CREATE TABLE STUDENT(
SNO NUMBER(6),
EMAIL VARCHAR2(30) CONSTRAINTS UK_STUDENT_EMAIL UNIQUE, --列级别约束
);
CREATE TABLE STUDENT(
SNO NUMBER(6),
EMAIL VARCHAR2(30) ,
--表级别约束
CONSTRAINTS UK_STUDENT_EMAIL UNIQUE(EMAIL)--唯一约束
);
11.Check约束
Check约束用于对一个属性的值加以限制
在check中定义检查的条件表达式,数据需要符合设置的条件
在这种约束下,插入记录或修改记录时,系统要测试新的记录的值是否满足条件
--【检查约束】 check
DROP TABLE STUDENT PURGE;
CREATE TABLE STUDENT(
SNO NUMBER(6),
SEX CHAR(3) CHECK(SEX IN('男','女')),--列级别检查约束
);
CREATE TABLE STUDENT(
SNO NUMBER(6),
SEX CHAR(3),
--表级别约束
CONSTRAINTS CK_STUDENT_SEX CHECK(SEX IN('男','女'))
);
12.外键约束
外键是表中的一个列,其值必须在另一表的主键或者唯一键中列出
作为主键的表称为“主表”,作为外键的关系称为“依赖表”
外键参照的是主表的主键或者唯一键
对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:
RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除
SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值
FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
[ON DELETE [CASCADE|SET NULL]] 如省略on短语,缺省为第一中处理方式。
--【外键约束】
--foregin key
--创建班级表
--【主表】
DROP TABLE CLAZZ PURGE;
CREATE TABLE CLAZZ(
CLASSNO NUMBER(3) PRIMARY KEY,
CLASSNAME VARCHAR2(30) NOT NULL
);
--添加数据
INSERT INTO CLAZZ VALUES(201,'JAVA精英班');
INSERT INTO CLAZZ VALUES(202,'JAVA就业班');
INSERT INTO CLAZZ VALUES(203,'大数据班');
INSERT INTO CLAZZ VALUES(204,'H5前端班');
INSERT INTO CLAZZ VALUES(205,'UI设计班');
COMMIT;
SELECT * FROM CLAZZ;
--【外键约束】
--学生表【从表】
DROP TABLE STUDENT PURGE;
CREATE TABLE STUDENT(
SNO NUMBER(6),
SNAME VARCHAR2(20) NOT NULL,
SEX CHAR(3),
AGE NUMBER(3),
ENTERDATE DATE,
CLASSNO NUMBER(3) REFERENCES CLAZZ(CLASSNO),--列级别约束
EMAIL VARCHAR2(30) UNIQUE,
--表级别约束
CONSTRAINTS PK_STUDENT PRIMARY KEY(SNO),
CONSTRAINTS CK_STUDENT_SEX CHECK(SEX IN('男','女'))
);
DROP TABLE STUDENT PURGE;
CREATE TABLE STUDENT(
SNO NUMBER(6),
SNAME VARCHAR2(20) NOT NULL,
SEX CHAR(3),
AGE NUMBER(3),
ENTERDATE DATE,
CLASSNO NUMBER(3),
EMAIL VARCHAR2(30) UNIQUE,
--表级别约束
CONSTRAINTS PK_STUDENT PRIMARY KEY(SNO),
CONSTRAINTS CK_STUDENT_SEX CHECK(SEX IN('男','女')),
CONSTRAINTS FK_STUDENT_CLASSNO FOREIGN KEY(CLASSNO) REFERENCES CLAZZ(CLASSNO)
);
--级联删除 设置
CREATE TABLE STUDENT(
SNO NUMBER(6),
SNAME VARCHAR2(20) NOT NULL,
SEX CHAR(3),
AGE NUMBER(3),
ENTERDATE DATE,
CLASSNO NUMBER(3),
EMAIL VARCHAR2(30) UNIQUE,
--表级别约束
CONSTRAINTS PK_STUDENT PRIMARY KEY(SNO),
CONSTRAINTS CK_STUDENT_SEX CHECK(SEX IN('男','女')),
CONSTRAINTS FK_STUDENT_CLASSNO FOREIGN KEY(CLASSNO) REFERENCES CLAZZ(CLASSNO) ON DELETE CASCADE
);
--级联删除 设置为空
CREATE TABLE STUDENT(
SNO NUMBER(6),
SNAME VARCHAR2(20) NOT NULL,
SEX CHAR(3),
AGE NUMBER(3),
ENTERDATE DATE,
CLASSNO NUMBER(3),
EMAIL VARCHAR2(30) UNIQUE,
--表级别约束
CONSTRAINTS PK_STUDENT PRIMARY KEY(SNO),
CONSTRAINTS CK_STUDENT_SEX CHECK(SEX IN('男','女')),
CONSTRAINTS FK_STUDENT_CLASSNO FOREIGN KEY(CLASSNO) REFERENCES CLAZZ(CLASSNO) ON DELETE SET NULL
);
13.添加约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型 具体的约束说明
--添加约束
ALTER TABLE STUDENT ADD CONSTRAINTS PK_STUDENT PRIMARY KEY(SNO);
ALTER TABLE STUDENT ADD CONSTRAINTS UK_STUDENT_EMAIL UNIQUE(EMAIL);
14.删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名
可增加或删除约束,但不能直接修改
--删除约束
ALTER TABLE STUDENT DROP CONSTRAINTS PK_STUDENT;
上一篇: 数据库||表约束
下一篇: 二叉树详解-Java实现二叉树数据结构