龙空技术网

其实Oracle并不难——这十天,跟着我一起学习数据库(第八天)

春春爱太阳 398

前言:

眼前咱们对“查询选课oracle”大概比较重视,兄弟们都需要分析一些“查询选课oracle”的相关文章。那么小编在网摘上搜集了一些关于“查询选课oracle””的相关内容,希望我们能喜欢,咱们快快来学习一下吧!

/*

完整性约束:

1.约束: Constraint,是定义在表上的一种强制规则。

当为某个表定义约束后,对该表做的所有SQL操作都必须满足约束的规则要求,否则操作将失败。

如果是给已有的表添加约束,如果该表中已经有数据,那么要求已有的数据必须满足约束条件,该约束才能添加成功;

一般,约束是在建表的同时添加的;

2.常用约束;

A:not null--非空约束

语法:

只能定义在列级约束:列名 数据类型 [默认值] not null;

B:unique--唯一性约束,该字段中不能有重复的值

语法;

列级约束:列名 数据类型 constraint 约束名 unique;

表级约束:......, constraint 约束名 unique(被约束的字段列表);

C:primary key--主键约束,主键约束满足唯一性约束

语法:

列级约束:列名 数据类型 constraint 约束名 primary key;

表级约束:......, constraint 约束名 primary key(被约束的字段列表);

D:foreign key--外键约束

语法:

列级约束:列名 数据类型 constraint 约束名 references 被参照的表名(被参照的唯一键字段)

on 外键参照的操作类型;

表级约束:......, constraint 约束名 foreign key(外键字段名) references 被参照的表名(被参照的唯一键字段)

on 外键参照的操作类型;

(注意;foreign key定义在子表的列中,references引用列所在的列中,

on delete cascade:当父表中的行被删除时,子表中相依赖的行同时被删除;

on delete set null:当父表中的行被删除时,子表中相依赖的行被转换为空值;

当无以上的选项时,当附表中的行被删除时,如果父表中的行在子表中被引用,则提示不能被删除)

E:check--定义检查约束

语法;

列级约束:列名 数据类型 constraint 约束名 check(约束规则);

表级约束:......, constraint 约束名 check(约束规则);

(注意:表达式不允许使用:

伪列,例如: CURRVAL, NEXTVAL, LEVEL及 ROWNUM;

可以调用SYSDATE, UID, USER及 USERENV 函数;

对其它记录其它值的查询。)

3.概念

主键;在一个表中用于唯一标识一条记录的字段(字段组合)叫做主键(主键首先要满足唯一性约束)

唯一键(候选键):可以唯一标识数据记录的键,叫做唯一键

外键;一个表的唯一键(包括主键)在另外一个表中作为参照字段,这个唯一键字段在这个参照表中就叫做外键。

!注意;一个表中可以有多个唯一键,但是只能有一个主键(主键组合)

4.约束的命名

约束也是对象,需要像表一样进行命名;

除了not null约束外,建议给其他约束起名字,命名规则为:表名_列名_约束类型。

给约束进行命名,可以通过名字对约束进行维护。

5.约束的分类

根据约束定义的位置,可以分为列级约束和表级约束;

A:约束既可以写在每个对应列的后面,称之为列级约束,一个列级别约束只能作用在一个列上;

B:也可以写完所有列之后,在写约束,称之为表级约束,一个表级别约束既可以作用在一个列上,也可以作用在列的组合上。

not null约束只能定义在列级别上;

联合主键或联合唯一性约束只能定义在表级别上;

其他为约束既可以定义成表级别,也可以定义成列级别。

另外,表级别和列级别约束达到的作用完全相同,只是书写的位置不同;

语法;

列级约束:列名 数据类型 constraint 约束名 约束类型;

表级约束:......, constraint 约束名 约束类型(被约束的字段列表);

6. 追加约束

也可以用ALTER TABLE语句为表:

A:追加或删除约束,但不修改它的结构;

语法:

alter table 表名 add[constraint 约束名] 约束类型(被约束的字段列表);

例如:alter table 表名 add constraint 约束名 foreign key(被约束的字段列表)references 被参照的表名(被参照的唯一键字段)

alter table 表名 drop constraint 约束名 cascade; (DROP子句的CASCADE选项导致任何与其相依赖的约束也被删除)

B:启用或禁用约束;

约束禁用

如果有大批量数据导入时,我们可以采用禁用约束的方法,主要的好处,首先效率高,另外有主外键约束的表之间导入时,不用考虑导入的先后顺序。

禁用约束语法:

alter table 表名 disable constraint 约束名 [cascade];应用CASCADE选项禁用相依赖的外键约束

启用约束语法:

alter table 表名 enable constraint 约束名 [cascade];

C:用MODIFY子句添加一个NOT NULL约束;

语法:

alter table 表名 modify[constraint] 约束名 约束类型(被约束的字段列表);

例如:alter table 表名 modify(被约束的字段列表 [constraint] not null);

7.外键约束的三种级联操作

外键作为另一个表的主键,是两个表之间的参照关系;

在删除外键引用的主表|父表(作为外键的主键所在的表)记录时,引用这些键值的从表|子表中记录如何处理?

(1)不允许删除(默认)

如果从表中有对主表记录的引用,则不允许删除主表的记录

(2)级联删除(cascade)

从表的相关记录也进行删除

(3)将外键字段设置null值(set null)

从表中外键的值设置为null值

*/

create table dept30 as select * from dept;

select * from dept30;

drop table dept30;

---创建定义表时条件的约束

---列级约束

create table emp30(

empno number(4) not null constraint emp30_empno_pk primary key,---列级约束

ename varchar2(10)not null,

job varchar2(9),

mgr number(4) constraint emp30_mgr_unique unique,

hiredate date,

sal number(7,2) constraint emp30_sal_check check(sal>=2000),---追加一个约束?

comm number(7,2),

deptno number(2) not null constraint emp30_deptno_fk references dept30(deptno)

);

---表级约束

create table dept30(

deptno number(2) not null,

dname varchar2(14)not null,

loc varchar2(13)not null,

constraint emp30_deptno_pk primary key(deptno),

constraint emp30_dl_unique unique(dname,loc)

);

--追加表名为emp30的自定义检查性约束

alter table emp30 add constraint emp30_sal_check check(sal>=2000);

--删除约束

alter table emp30 drop constraint emp30_mgr_unique;

-------------------外键的级联删除

---(1)不允许删除(默认)

------如果从表中有对主表记录的引用,则不允许删除主表的记录

-----------------------准备数据-----------------------------

--创建员工表

create table emp40 as select *from emp;

--创建部门表

create table dept40 as select * from dept;

--为emp40添加主键

alter table emp40 add constraint emp40_empno_pk primary key(empno);

--为dept40表添加主键

alter table dept40 add constraint dept40_deptno_pk primary key(deptno);

--为emp40添加外键

alter table emp40 add constraint emp40_deptno_fk foreign key(deptno) references dept40(deptno);

---没有写on,默认级联类型

----删除deptno表中部门标号为30的记录(不允许删除)

delete from dept40 where deptno=30;

select * from emp40;

------------------------------------------------------------

---(2)级联删除(cascade)

------从表的相关记录也进行删除

-----------------------准备数据-----------------------------

--创建员工表

create table emp50 as select *from emp;

--创建部门表

create table dept50 as select * from dept;

--为emp50添加主键

alter table emp50 add constraint emp50_empno_pk primary key(empno);

--为dept50表添加主键

alter table dept50 add constraint dept50_deptno_pk primary key(deptno);

--为emp50添加外键

alter table emp50 add constraint emp50_deptno_fk foreign key(deptno) references dept50(deptno) on delete cascade;

---没有写on,默认级联类型

----删除deptno50表中部门标号为30的记录(deptno50表中部门标号为30的员工信息一块被删除)

delete from dept50 where deptno=30;

select * from emp50;

------------------------------------------------------------

---(3)将外键字段设置null值(set null)

------从表中外键的值设置为null值

-----------------------准备数据-----------------------------

--创建员工表

create table emp60 as select *from emp;

--创建部门表

create table dept60 as select * from dept;

--为dept60表添加主键

alter table dept60 add constraint dept60_deptno_pk primary key(deptno);

--分别为emp60添加主键和外键

alter table emp60 add constraint emp60_empno_pk primary key(empno);

alter table emp60 add constraint emp60_deptno_fk foreign key(deptno) references dept60(deptno) on delete set null;

---没有写on,默认级联类型

----删除deptno60表中部门标号为30的记录(deptno60表中部门标号为30的外键部门编号被设置为空)

delete from dept60 where deptno=30;

select * from emp60;

------------------------------------------------------------

---****************ppt14练习1**************---

--1.学校有一个选课系统,其中包括如下关系模式:

--系(系编号: 主键,

-- 系名称: 唯一键,

-- 系主任: 非空约束,

-- 系所在校去:取值范围只能在南湖校区和浑南校区)

--班级(班级编号: 主键,

-- 班级名称: 唯一键,

-- 所属系: 外键)

create table department(

dno number(4)not null constraint department_dno_pk primary key,

dname varchar2(10) constraint department_dname_unique unique,

dhead varchar2(10)not null,

dloc varchar2(14) constraint deparment_dloc_check check(dloc='南湖校区' or dloc='浑南校区')

);

create table myclass(

mno number(4)not null constraint myclass_mno_pk primary key,

mname varchar2(10) constraint myclass_mname_unique unique,

dno number(4)not null constraint myclass_dno_fk references department(dno)

);

--2.创建学生表,包含如下属性:

--学号 定长字符型 10位 主键

--姓名 变长字符型 20位 非空

--性别 定长字符型 2位 取值范围只能为男或女

--出生日期 日期型

--所在班级

create table student(

sno char(10) not null constraint student_sno_pk primary key,

sname varchar(20)not null,

ssex char(2) constraint student_ssex_check check(ssex='男' or ssex='女'),

sbirthday date,

mno number(4)not null,

constraint student_mno_fk foreign key(mno) references myclass(mno)

);

---****************ppt14课后作业**************---

--1.简述5种约束的含义。

--2.创建学生关系sc,包括属性名:

--选课流水号 数值型 主键;

--学生编号 非空 外键

--课程编号 非空 外键;

--成绩 0-100之间;

create table sc(

scno number not null constraint sc_scno_pk primary key,

sno char(10) not null,

cno char(10) not null,

scgrade number(4)not null,

constraint sc_sno_fk foreign key(sno) references student(sno),

constraint sc_cno_fk foreign key(cno) references course(cno)

);

--3.创建copy_emp,要求格式同emp表完全一样,不包含数据。

create table copy_emp as select * from emp;

delete from copy_emp;

--4.创建copy_dept,要求格式同dept表完全一样,不包含数据。

create table copy_dept as select * from dept;

delete from copy_dept;

--5.设置copy_emp 表中外键deptno,参照copy_dept中deptno,语句能否成功,为什么?

alter table copy_emp add constraint copy_emp_deptno_fk foreign key (deptno)references copy_dept(deptno);

不能成功,因为deptno不是copy_dept的主键。

--6.追加copy_dept表中主键deptno

alter table copy_dept add constraint copy_dept_deptno_pk primary key(deptno);

select * from copy_emp;

select * from copy_dept;

标签: #查询选课oracle