ORACLE学习05-约束

1、约束分类

主键约束(PRIMARY KEY):用于唯一标示表中的一个列,在一个表中的主键约束只能有一个,但是可以在一个主键约束中包含多个列,也称为联合约束或者联合主键。
外键约束(FOREIGN KEY):用于约束表与表之间关联关系。
唯一约束(UNIQUE KEY):用于唯一标示表中的一个列,与主键约束不同,在一张表中可以多个唯一约束。
检查约束(CHECK):用于约束表中列的输入值得范围,比如在输入性别时,要求数据库中只能输入男或者女,就可以使用检查约束来约束该列。
非空约束(NOT NULL):表示该列一定有值,不能为空。
默认约束(DEFAULT):用于向列中插入默认值。

2、约束的命名

建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。
非空约束     NN_表名_列名
唯一约束     UK_表名_列名
主键约束     PK_表名
外键约束     FK_表名_列名
条件约束     CK_表名_列名
默认约束     DF_表名_列名

3、主键约束 PRIMARY KEY

文档原文翻译如下
A table or view can have only one primary key.
一个表或视图有且只有一个主键

None of the columns in the primary key can be LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the primary key can contain a column of TIMESTAMP WITH LOCAL TIME ZONE.
主键字段不能为LOB、LOG、LOG RAW、VARRAY、NESTED TABLE、BFILE、REF、TIMESTAMP WITH TIME ZONE或用户定义类型。然而它可以包含TIMESTAMP WITH LOCAL TIME ZONE类型的字段。

The size of the primary key cannot exceed approximately one database block.
主键大小不能超过一个数据块大小。

A composite primary key cannot have more than 32 columns.
主键组合键不能超过32列。

You cannot designate the same column or combination of columns as both a primary key and a unique key.
你不能指定一列或组合列既是主键又是唯一键。

You cannot specify a primary key when creating a subview in an inheritance hierarchy. The primary key can be specified only for the top-level (root) view.
创建一个继承层次结构中的子视图时,你不能指定一个主键。主键可以唯一指定的顶层(根)视图。

创建表的时候声明主键
--声明列是声明约束
create table student(
sid int not null primary key,
...
);

--或 通过 constraint 声明约束
--格式: constraint 约束名称 约束类型 (受约束列)
drop table student cascade constraints;
create table student(
sid int not null,
...
constraint pk_stu_sid primary key(sid)
)

通过alter语句添加主键约束
--格式: alter table 表名 add constraint 约束名称 约束类型 (受约束列);
alter table student add constraint pk_stu_sid primary key (sid);

4、外键 FOREGIN KEY

文档原文翻译
Restrictions on Foreign Key Constraints Foreign key constraints are subject to the following restrictions:
None of the columns in the foreign key can be of LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type. However, the primary key can contain a column of TIMESTAMP WITH LOCAL TIME ZONE.
外键字段不能为LOB, LONG, LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, or user-defined type类型,主键可以包含数据类型为TIMESTAMP WITH LOCAL TIME ZONE的字段。

The referenced unique or primary key constraint on the parent table or view must already be defined.
引用唯一或主键约束,必须是父表中已经定义的。

A composite foreign key cannot have more than 32 columns.
外键的组合列不能超过32列。

The child and parent tables must be on the same database. To enable referential integrity constraints across nodes of a distributed database, you must use database triggers. See CREATE TRIGGER.
字表和父表必须在同一个数据库。分布式数据库中,外键不能跨节点,但触发器可以
If either the child or parent object is a view, then the constraint is subject to all restrictions on view constraints. See "View Constraints".

You cannot define a foreign key constraint in a CREATE TABLE statement that contains an AS subquery clause. Instead, you must create the table without the constraint and then add it later with an ALTER TABLE statement.
你不能在CREATE TABLE语句中包含AS子查询子句定义一个外键约束。相反,你必须创建一个没有约束的表,然后添加ALTER TABLE语句。

创建表的时候声明外键
drop table clazz cascade constraints;
drop table student cascade constraints;
create table clazz(
cid int not null primary key,
bak_id int not null unique
);
create table student(
sid int not null primary key,
cid int ,
--foreign key(cid) references clazz(cid),
constraint fk_stu_cid foreign key(cid) references clazz(cid)
)

通过alter语句添加或者修改外键约束
alter table student add constraint fk_stu_cid2 foreign key(cid) references clazz(bak_id) [on delete cascade | set null];
-----------------------------
on delete set null: 当主表中的一行数据被删除时,Oracle系统会自动地将所有从表中依赖于它的数据记录的外键改成空值;
on delete cascade: 当主表中的一行数据被删除时,Oracle系统会自动地将所有从表中依赖于它的数据记录删除;

外键约束对DML与DDL的影响
insert: 只有操作是在子表一端时才可能产生违反引用完整性约束的问题。
delete: 只有操作是在父表这一端时可能产生违反引用完整性约束的问题。
update: 子表父表直接操作都可能违反引用完整性约束。

解决外键约束带来的完整性约束的问题
先更新子表的引用列为空,再更新父表的主键的列的值,然后把子表的引用列更新成新的父表的值;
使用on deleteset null、on delete cascade,先更新父表,然后将子表外键为空的记录更新为新的值。
注: 如果在外键定义中使用了on delete set null 或 on delete cascade,无论删除操作是在父表这一端还是子表这一端都不会产生违反引用完整性的问题,但是却留下了安全隐患(一般不这样)。

5、非空约束 NOT NULL

创建表的时候声明
drop table student cascade constraints;
create table student(
sid int not null
...
)

通过alter语句添加约束
drop table student cascade constraints;
create table student(
sid int
);
--非空约束比较特殊。
alter table student modify (sid constraint nk_stu_sid not null);-- 非空
alter table student modify(sid not null); -- 非空
alter table student modify(sid null); -- 可以为空

6、唯一约束

创建表的时候声明
drop table student cascade constraints;
create table student(
--sid int unique,
sid int,
constraint uk_stu_sid unique(sid)
);

通过alter语句添加约束
drop table student cascade constraints;
create table student(
sid int
);
alter table student add constraint uk_stu_sid unique(sid);

7、检查约束

创建表的时候声明约束
drop table student cascade constraints;
create table student(
sid integer not null,
--sno number(12) check(length(sno) between 4 and 12), --检查约束,输入长度(位数)4-12位
sno number(12),
constraint ck_stu_sno check(length(sno) between 4 and 12)
);

通过alter语句添加约束
drop table student cascade constraints;
create table student(
sid integer not null,
sno number(12)
);
alter table student add constraint ck_stu_sno check(length(sno) between 4 and 12);

8、默认约束

创建表的时候声明约束
drop table student cascade constraints;
create table student(
sid integer not null,
studyDate date default(sysdate) --默认约束

);

通过alter语句添加约束
drop table student cascade constraints;
create table student(
sid integer not null,
studyDate date
);
--默认约束同非空约束很像
alter table student modify(studyDate default sysdate);

9、约束的查询

存储约束的表
user_constraints:当前用户所创建的。
all_constraints:当前用户所创建的以及当前用户能访问的。
dba_constraints:整个数据库的。

存储约束与字段或表的关系的表(同上)
user_cons_columns:
all_cons_columns:
dba_cons_columns:

xxx_constraints表中的constraint_type的类型
C --- 表或者字段的检查约束 check
P --- 主键约束 primary key
R --- 外键约束 foreign Key
U --- 唯一约束 unique
还有其他 O,V 有兴趣可以查资料

查询某个表中的某个字段的约束
select
a.constraint_name,
a.constraint_type,
b.column_name
from user_constraints a, user_cons_columns b
where a.table_name = b.table_name
and a.constraint_name = b.constraint_name
and a. table_name = ‘STUDENT‘
and b.column_name = ‘SID‘;

10、约束的管理(启用、禁用、重命名、删除)

禁用约束
alter table 表 disable constraint 约束名 [cascade];
----------------------------------------
drop table student cascade constraints;
create table student(
sid integer not null primary key,
cid int,
constraint uk_stu_cid unique(cid)
);

alter table student disable primary key cascade;
alter table student disable constraint uk_stu_cid cascade;
--参数CASCADE子句用来关闭存在有完整性关系的约束,比如DISABLE一个主键,如果没有CASCADE子句就会出错,此时使用CASCADE子句DISABLE主键可以将该主键与相关外键一起DISABLE掉。使用的情况:例如在数据库系统中大规模装入数据时,为了系统的效率您不得不牺牲数据的一致性来关闭一些约束,甚至删除一些约束将主表主键禁止的同时,也将禁止依赖于此主键的外键禁止了.

启用约束
alter table 表 enable constraint 约束名;
-------------------------------------------
drop table student cascade constraints;
create table student(
sid integer not null primary key,
cid int,
constraint uk_stu_cid unique(cid)
);

alter table student disable constraint uk_stu_cid cascade;
alter table student enable constraint uk_stu_cid ;

重命名
alter table 表 rename constraint old约束名称 to new约束名称;
---------------
drop table student cascade constraints;
create table student(
sid integer,
constraint uk_stu_sid unique(sid)
);
alter table student rename constraint uk_stu_sid to uk_stu_sid2;

删除约束
alter table student drop constraint 约束名称;
alter table student drop constraint uk_stu_sid2;
时间: 2024-10-11 01:37:48

ORACLE学习05-约束的相关文章

(六)Oracle学习笔记—— 约束

1. 约束介绍 表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性. 按照约束的分类,一共有五种约束:非空约束.唯一约束.主键约束.检查约束.外键约束. 1.1 使用如下命令检索某个表上的所有约束(WHERE条件中的表名和用户名要大写) select * from all_constraints where table_name='EMP' and owner='SCOTT'; 对于表中的CO

Oracle学习系列5

Oracle学习系列5 ************************************************************************************ 1,掌握表的建立与删除 了解Oracle中的主要数据类型 2,约束的分类和使用 3,表的关联:交,并,补 4,掌握ROWNUM伪列的作用 5,掌握序列的使用 6,掌握视图的作用 7,了解同义词,用户管理,权限分配与撤销,数据库的备份 ------------------------------------

Oracle学习(三):单行函数

1.知识点:可以对照下面的录屏进行阅读 SQL> --字符函数 SQL> --字符串的转换 SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写 2 from dual; SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符 SQL> select substr('Hello World',4) from dual; SQL&

Oracle学习(九):创建和管理表

1.知识点:可以对照下面的录屏进行阅读 SQL> --创建表 SQL> create table test1 2 (tid number, 3 tname varchar2(20), 4 hidatedate date default sysdate); SQL> --使用as和子查询快速建表 SQL> --创建表:包含员工号 姓名 月薪 年薪 部门名称 SQL> create table empincome 2 as 3 select empno,ename,sal,sal

【我的Oracle学习笔记(二)】----- select语句补充

一.多表查询 多表查询是指从多个有关联的表中查询数据,其语法与单表查询类似.一般来说,多表查询的表要用连接联系起来,如果没连接,则查询结果是这多个查询表的笛卡尔积(注释1). 模拟查询雇员姓名和所在部门名称: select [雇员姓名],[部门名称] from [雇员表] a,scott,[部门表] b where a.[部门编号]=b.[部门编号]; 上例中,为每一个查询表指定了别名,便于SQL语句的书写. 模拟查询在”sales“部门工作的雇员其雇员姓名 select [雇员姓名] from

Oracle学习系列1-7

Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 300    ; set pagesize 30     ; 编辑sql命令: ed a.sql 执行 @a 切换用户: conn User/passwd   [as sysdba|sysoper ] conn system/manager conn sys/change_on_install  as

oracle学习入门系列之二 数据库基础知识

oracle学习入门系列之二 数据库基础知识 本篇蛤蟆要梳理下那些被淡忘的数据库基础知识,也许根本就没被人记住过.不管是哪种情况,该记住的必须记住,记不住就把他记下来吧. 首先问几个问题如下: 数据库基础知识是什么? 好吧,蛤蟆直接吐后而不亡,看目录开始吧. 本人邮箱:[email protected] 微信公众号:HopToad 欢迎各界交流 1      基本概念 概念就是概念,大伙对这些名词不要死磕,但是对定义一定要理解,理解方能领悟,领悟方能运用自如后创新. 1.1      数据 数据

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH

oracle学习入门系列之六 模式

oracle学习入门系列之六 模式 上篇咱们学习记录了ORACLE数据库中的数据库结构.内存结构和进程等,篇幅 蛤蟆感觉偏多了.这次要休整下,每次笔记不宜太多,不然与书籍有何区别.我们要保证的是每次做记录都能所有收获所有提升. 上次中我们从总体上把握了下ORACLE系统结构,这次开始我们将涉及到ORACLE数据库的具体方方面面了.本次就从模式对象入手. 老规矩,先来两个问题: a)        什么事模式 b)       为什么需要 搞清楚这两个问题即可. 本人邮箱:[email prote

Oracle学习基本知识点总结

 以下是我总结的OCP教程的知识点,以备参考之用! 1, What's Oracle Server? ·         It's a database management system that provides an open, comprehensive, integrated approach to information management. ·         Consists of an Oracle instance and an Oracle database 2,What