表和约束

2
1

programming
1
Oracle SQL开发基础


2
2

programming
课程结构
内容

课时(H)

第一章 Oracle数据库基础

2.5

第二章 编写简单的SELECT语句

1.5

第三章 限制数据和对数据排序

2

第四章 单行函数

4

第五章 多表查询

4

第六章 分组函数

3

第七章 子查询

4

第八章 数据操作与事务控制

4

第九章 表和约束

4

第十章 其他数据库对象

4


2
3

programming
第九章 表和约束
目标:
本章旨在向学员介绍:
1)表的操作方式
2)数据完整性约束
时间: 4学时
教学方法:讲授ppt+上机练习
2
4

programming
本章要点
.创建表
.修改表
.删除表
.重命名
.截断表
.数据完整性约束



2
5

programming
第九章 表和约束

表和约束:

9.1创建表

9.2修改表

9.3删除、重命名与截断表

9.4约束

9.5相关数据字典


2
6

programming
9.1.1Oracle中数据库对象命名原则
.Oracle中数据库对象命名原则
–必须由字母开始,长度在 1–30个字符之间。
–名字中只能包含 A–Z, a–z, 0–9, _ (下划线),$ 和 #。
–同一个Oracle服务器用户所拥有的对象名字不能重复。
–名字不能为Oracle的保留字。
–名字是大小写不敏感



2
7

programming
9.1.2建表语句语法 1/3
.建表语法


CREATE TABLE [schema.]table
(column datatype [DEFAULT expr][, ...]);
2
8

programming
9.1.2建表语句语法 2/3

CREATE TABLE DOSSIER (

 ID NUMBER(4),

 CNAME VARCHAR2(20 ),

 BIRTHDAY DATE,

 STATURE NUMBER(3),

 WEIGHT NUMBER(5, 2),

 COUNTRY_CODE CHAR(2 ) DEFAULT ‘01’);

示例
2
9

programming
9.1.2建表语句语法 3/3
.默认值应用
–插入默认值
–使用默认值修改


insert into dossier
(ID,CNAME,BIRTHDAY, STATURE,WEIGHT )
values
(2,'姚明' , to_date('1980.9.12','yyyy.mm.dd'),226, 134 );
已创建 1 行。
update dossier set country_code =default where id=2;
2
10

programming
9.1.3用子查询语法创建表 1/2

.使用子查询创建表的语法
.新表的字段列表必须与子查询中的字段列表匹配
.字段列表可以省略


CREATE TABLE table[(column, column...)]
AS subquery;
2
11

programming
9.1.3用子查询语法创建表 2/2


 

.Select列表中的表达式列需要给定别名,如果没有别名会产生
错误


CREATE TABLE dept10
AS
SELECT employee_id, last_name, salary+1000 newSalary
FROM employees
WHERE department_id = 10;
2
12

programming
9.1.4引用另一个用户的表
.如果一个表不属于当前用户,如果引用它,必须把方案名放在
表名的前面。例如,scott.emp


 

SELECT *
FROM scott.emp;
2
13

programming
9.1.5Oracle中表的分类
.Oracle 数据库中的表分为下面两类:
–用户表:由用户创建和维护的表的集合,它包含用户所使
用的数据。
–数据字典:由Oracle 服务器创建和维护的表的集合,它包
含数据库信息,比如是表的定义,数据库结构的信息等,
可以把它理解为管理表的表,由Oracle服务器创建和维护。
如user_tables。



2
14

programming
第九章 表和约束
表和约束:

9.1创建表

9.2修改表

9.3删除、重命名与截断表

9.4约束

9.5相关数据字典


2
15

programming
9.2.1数据类型与列定义
VARCHAR2 (size)
DATE
NUMBER(p,s)
CHAR(size)
LONG
LONG RAW

CLOB

BLOB
BFILE
最大可存储2G的可变长度字符数据
最大可存储2G的可变长度二进制数据,
最大可存储4G的字符数据
最大可存储4G二进制的数据
最大可存储4G数据,保存在数据库外部的文件里

日期和时间类型

可变长度字符数据,最小字符数是 1;最大字符数是 4000
数值型:总长度为p,小数位最大为s位 ,整数位最大为p-s位,p的
范围从1到38,s的范围从-84到127
固定长度字符数据,长度的大小以字节为单位,默认和最小字符数为
1;最大字符数为 2000
ROWID 十六进制串,表示行在表中唯一的行地址
数据类型 说明


2
16

programming
9.2.2修改表的定义
.添加列语法:


 

.修改列语法:
.删除列语法:


ALTER TABLE table
DROP (columnname [,columnname]);
ALTER TABLE table
MODIFY(columnname datatype[DEFAULT expr]
[, columnname datatype]...);
ALTER TABLE table
ADD (columnname datatype[DEFAULT expr]
[, columnname datatype]...);
2
17

programming
9.2.3添加新列
.增加列原则:
–可以添加或修改列
–不能指定新添加列的位置,新列会成为最后一列。


.如在dossier表上增加性别字段:


ALTER TABLE dossier ADD (sex CHAR(1));
2
18

programming
9.2.4修改已存在的列 1/2
.列的修改可以修改数据类型,长度,及默认值。
.修改数据类型:已有的行数据必须为空。
.修改长度原则:
数值型修改长度:当长度向小改时,已有行的数该列必须为空;
当长度向大改时,可以随意修改。
字符型修改长度:当长度向小改时,只要修改后的值能容纳下
当前已有数据的最大值即可,当长度向大改时,可以随意修改。
.修改列的默认值:
-默认值的修改不会影响已经存在的行,只影响新增加的行。



2
19

programming
9.2.4修改已存在的列 2/2
.把dossier表性别(sex) 列,修改为长度为2
.添加默认值


ALTER TABLE dossier
MODIFY (sex DEFAULT ‘男’);
ALTER TABLE dossier MODIFY (sex CHAR(2));
2
20

programming
9.2.5删除列 1/2
.可以用DROP子句从表中删除列,包括列的定义和数据。
.删除列原则:
–列可以有也可以没有数据。
–表中至少保留一列。
–列被删除后,不能再恢复。
–被外键引用的列,不能被删除。



2
21

programming
9.2.5删除列 2/2
.删除列语法一
.删除列语法二
.删除dept10表的两个字段“last_name”和“newsalary”。


 

ALTER TABLE dept10 DROP (last_name,newsalary);
ALTER TABLE emp DROP COLUMN sex;
ALTER TABLE table DROP (columnname[,columnname]);
2
22

programming
第九章 表和约束
表和约束:

9.1创建表

9.2修改表

9.3删除、重命名与截断表

9.4约束

9.5相关数据字典


2
23

programming
9.3.1删除表
.删除表语法:
–只有表的创建者
–或具有DROP ANY TABLE权限的用户才能删除表


.删除表原则:
–表中所有的数据和结构都被删除。
–任何视图和同义词被保留但无效。
–所有与其相关的约束和索引被删除。
–任何未完成的事务被提交。


DROP TABLE emp;
DROP TABLE table;
2
24

programming
9.3.2重命名表
.重命名语句语法:
–必须是对象的所有者


.把emp表重新命名为empl


RENAME emp TO empl;

RENAME old_name TO new_name;
2
25

programming
9.3.3截断表
.截断表语法:
–执行TRUNCATE语句的前提,必须是表的所有者
–或者有DELETE ANY TABLE系统权限来截断表。


TRUNCATE TABLE emp;
TRUNCATE TABLE table;
2
26

programming
第九章 表和约束
表和约束:

9.1创建表

9.2修改表

9.3删除、重命名与截断表

9.4约束

9.5相关数据字典


2
27

programming
9.4.1约束的概念 1/2
.Oracle服务器用约束 (constraints) 来防止无效数据输入到表中。
约束做下面的事:
–多个表之间的具体关系,比如两个表之间的主外键关系。
–表在插入、更新行或者删除行的时候强制表中的数据遵循
约束规则。
–对于成功的操作,约束条件是必须被满足的。
–如果表之间有依赖关系,使用约束可以防止表或表中相关
数据的删除。



2
28

programming
9.4.1约束的概念 2/2
.约束命名
–约束命名原则:所有的约束定义存储在数据字典中。
–如果给约束一个有意义的名字,约束易于维护,约束命名
必须遵守标准的对象命名规则。
–如果没有给约束命名,Oracle服务器将用默认格式
SYS_Cn产生一个名字,这里 n 是一个唯一的整数,来保
证名称的唯一性。
–建议至少应该给表的主、外键按照命名原则来命名,如可
以采用这样的原则来命名,表名_字段名_约束类型。



2
29

programming
9.4.2约束的类型
约束

UNIQUE

指定列的值或者列的组合的值对于表中所有的行必须
是唯一的

说明
指定列不能包含空值

PRIMARY KEY 表的每行的唯一性标识

FOREIGN KEY
NOT NULL

在列和引用表的一个列建立并且强制的列之间关系

CHECK

指定一个必须为真的条件


2
30

programming
9.4.3生成与维护约束 1/9
.约束的语法如下:
–约束可以在两个级别上定义,表级约束与列级约束。
–列级约束能够定义完整性约束的任何类型。
–表级约束除了NOT NULL之外,能够定义完整性约束的任
何类型。


CREATE TABLE [schema.] table
(column datatype [ DEFAULTexpr][column_constraint],
...[table_constraint][,...]);
2
31

programming
9.4.3生成与维护约束 2/9

.NOT NULL约束
–NOT NULL约束在列级被指定
–而不可以指定为表级约束


CREATE TABLE COUNTRY (

 COUNTRY_CODE CHAR(2 ) PRIMARY KEY,

COUNTRY_NAME VARCHAR2(50) ,

 NOT NULL(COUNTRY_NAME));

CREATE TABLE COUNTRY (

 COUNTRY_CODE CHAR(2 ) PRIMARY KEY,

COUNTRY_NAME VARCHAR2(50) NOT NULL);


2
32

programming
9.4.3生成与维护约束 3/9
.UNIQUE约束
–唯一性约束条件确保所在的字段或者字段组合不出现重复

–唯一性约束条件的字段允许出现空值
–Oracle将为唯一性约束条件创建对应的唯一性索引



2
33

programming
9.4.3生成与维护约束 4/9
CREATE TABLE employees(

 employee_id NUMBER(6),

 last_name VARCHAR2(25) NOT NULL,

 email VARCHAR2(25),

 salary NUMBER(8,2),

 commission_pct NUMBER(2,2),

 hire_date DATE NOT NULL,

...

 CONSTRAINT emp_email_uk UNIQUE(email));

.UNIQUE约束(续)



2
34

programming
9.4.3生成与维护约束 5/9

.PRIMARY KEY约束
–主键从功能上看相当于非空且唯一
–一个表中只允许一个主键
–主键是表中能够唯一确定一个行数据的字段
–主键字段可以是单字段或者是多字段的组合
–Oracle为主键创建对应的唯一性索引



2
35

programming
9.4.3生成与维护约束 6/9
CREATE TABLE departments(
department_id NUMBER(4),
department_name VARCHAR2(30)
CONSTRAINT dept_name_nn NOT NULL,
manager_id NUMBER(6),
location_id NUMBER(4),
CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
.PRIMARY KEY约束示例



2
36

programming
9.4.3生成与维护约束 7/9

.FOREIGN KEY约束
–外键确保了相关的两个字段的两个关系:
.外键表外键列的值必须在主键表参照列值的范围内,或
者为空
.外键参照的是主键表的主键或者唯一键。


–主键表主键值被外键表参照时,主键表记录不允许被删除。
.ON DELETE CASCADE: 指当主键表中的行被删除时,
外键表中相依赖的行也将被级联删除。
.ON DELETE SET NULL: 当主键表中的行被删除时,
把涉及到外键表的外键值设置为空。



2
37

programming
9.4.3生成与维护约束 8/9

CREATE TABLE employees(
employee_id NUMBER(6),
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
hire_date DATE NOT NULL,
...
department_id NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));
.FOREIGN KEY约束示例



2
38

programming
9.4.3生成与维护约束 9/9
.CHECK 约束
–定义在字段上的每一记录都要满足的条件
–在check中定义检查的条件表达式,数据需要符合设置的条

–条件表达式不允许使用:
. SYSDATE, UID, USER, USERENV 等函数
.参照其他记录的值


..., salary NUMBER(2)

 CONSTRAINT emp_salary_min

 CHECK (salary > 0),...


2
39

programming
9.4.4现有表中增加/删除约束 1/2
.增加约束语法如下:


ALTER TABLE table ADD [CONSTRAINT constraint] type
(column);
2
40

programming
9.4.4现有表中增加/删除约束 2/2
.删除约束语法


 


Alter table country drop primary key CASCADE;
Alter table dossier drop constraint dossier_countrycode_fk;

Alter TABLE tablename
Drop Primary key | Unique (column)| Constraint constraint
[Cascade]
2
41

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


.禁用约束语法:


ALTER TABLE table DISABLE CONSTRAINT constraint
[CASCADE];
2
42

programming
9.4.5约束的启用和禁用 2/2
.启用约束语法:


ALTER TABLE table ENABLE CONSTRAINT constraint;


2
43

programming
第九章 表和约束
表和约束:

9.1创建表

9.2修改表

9.3删除、重命名与截断表

9.4约束

9.5相关数据字典


2
44

programming
9.5.1相关数据字典 1/2
.查询数据字典
.查看数据字典结构


 

DESC user_tables
SELECT table_name
FROM user_tables;
2
45

programming
9.5.1相关数据字典 2/2

.和约束相关的数据字典有:
USER_CONSTRAINTS:查看表上所有的约束。
USER_CONS_COLUMNS:查看与约束相关的列名,该视图
对于那些由系统指定名字的约束特别有用。
.在约束类型中,C代表CHECK,P代表PRIMARY KEY,R代
表FOREIGN KEY, U代表UNIQUE,NOT NULL约束实际上
是一个CHECK约束。


select constraint_name,constraint_type

from user_constraints;


2
46

programming
本章小结
.创建表 :建表语法,用子查询基于另一个表创建表。
.修改表 :修改表结构;修改列宽,改变列数据类型和添加列。
.删除表 :删除行和表结构。
.重命名 :重命名一个表、视图、序列或同义词。
.截断 :从表中删除所有行,并且释放该表已使用的存储空间。
.约束类型
.约束相关数据字典
–USER_CONSTRAINTS
–USER_CONS_COLUMNS



2
47

programming
练习
.1.创建表date_test,包含列d,类型为date型。试向date_test表
中插入两条记录,一条当前系统日期记录,一条记录为
“1998-08-18”。
.2.创建与departments表相同表结构的表dtest,将departments
表中部门编号在200之前的信息插入该表。
.3.创建与employees表结果相同的表empl,并将其部门编号为
前50号的部门的信息复制到empl表。
.4.试创建student表,要包含以下信息:


 学生编号(sno):字符型(定长)4位 主键

 学生姓名(sname):字符型(变长)8位 唯一

 学生年龄(sage):数值型 非空


2
48

programming
练习(续)

.5.试创建sc表(成绩表),要包含以下信息:


 学生编号(sno):字符型(定长)4位 主键 外键

 课程编号(cno):字符型(变长)8位 主键

 选课成绩(grade):数值型

.6.试为student增加一列学生性别 默认值 “女”。
.7.试修改学生姓名列数据类型为定长字符型10位。
.8.试修改学生年龄列允许为空。
.9.试为选课成绩列添加校验(check)约束为1-100;
.10.试删除sc表中的外键约束。



2
49

programming
谢谢



猜你喜欢

转载自blog.csdn.net/jiangjiewudi/article/details/9618047