wns9778.com_威尼斯wns.9778官网

热门关键词: wns9778.com,威尼斯wns.9778官网
wns9778.com > 计算机教程 > oracle-约束-序列

原标题:oracle-约束-序列

浏览次数:100 时间:2019-05-19

- 删除表

先删子表,后删父表

除非使用casecade  constraints  解除关联

drop table parent;

 wns9778.com 1

先删父表会出错:

有一个被foreign  keys关联的unique/primary  key的字段在表中

 

使用casecade  constraints解除关联就可以删掉父表

drop table parent cascade constranints;

wns9778.com 2

wns9778.com 3

1.3 唯一约束(unique)

唯一(UNIQUE)约束:在表中每一行中所定义的这列或这些列的值都不能相同。必须保证唯一性。否则就会违反约束条件。

用于指定列的值不能重复,但可以为null。

CONSTRAINT constraint_name UNIQUE (col_name1[, col_name2,…])

举例:

create table user3(id number unique,name varchar2(30));

insert into user3 values(1,'111');

insert into user3 values(1,'111');//报错,唯一性

insert into user3 values(null,111);

 例子

--创建唯一约束的三种方法
--(1)
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18) unique);
--(2)c
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18) constraint uk_idcard unique);

--(3)
create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18),constraint uk_idcard unique(idcard));

wns9778.com, 

primary key与unique的区别:

1.一张表可以有多个unique(唯一)约束;

2.一张表只能有一个主键;

3.设置为主键的列不能有null值;

级联删除和级联置空

wns9778.com 4

  • 级联删除:

在外键的最后,加上on delete  cascade  就是级联删除

再删除主表数据时和主表关联的子表数据也会删除

  • 级联置空

在在外键的最后,加上on  delete  set null就是级联置空

再删除主表数据时,会把和主表关联的外键设置成NULL

二 约束管理

- 建立表:

先建立父表,后建立子表(因为子表要用到父表)

除非先不考虑外键(建完表后再加),表多的时候可以不考虑建表顺序。弊端:对数据要求很严格,一个垃圾数据都不能放

父表:

create table parent(
  id number primary key,
  name varchar2(30),

);

wns9778.com 5

  

子表:

create table child(
  id number primary key,
  name varchar2(30),
  fid number constraint child_fid_fk references parent(id),
);

wns9778.com 6

1.6 外键约束(froeign key)

外键(FOREIGN KEY)约束:用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性。能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库;

用于定义主表和从表之间的关系,外键约束要定义在从表上,主表则必需具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必需在主表的主键列存在或是为null。

CONSTRAINT constraint_name

FOREIGN KEY (col_name1[, col_name2,…])

REFERENCES ref_table [(ref_col1[,ref_col2,…])]

[ ON DELETE { CASCADE | NO ACTION } ]

[ ON UPDATE { CASCADE | NO ACTION } ] ]

[ NOT FOR REPLICATION ]

houzhenhua@hope-pact.com

举例:

create table class(id number primary key,name varchar2(32));

create table stus(id number primary key,

name varchar2(36) not null,

classid number references class(id)

);

注意

1.外键指向主键列;

2.外键可以指向unique列;

3.建表时先建主表,再建从表;删除表先删从表,再删主表。

4.外键列属性值要与主键或unique列属性值的类型保持一致

5.外键列的值,必需在主键列中存在。但外键列的值允许为null

6.ON DELETE {CASCADE | NO ACTION}指定在删除表中数据时,对关联表所做的相关操作。在子表中有数据行与父表中的对应数据行相关联的情况下,如果指定了值CASCADE,则在删除父表数据行时会将子表中对应的数据行删除;如果指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的删除操作回滚。NO ACTION 是缺省值。

例子

create table student(
sno number(4) primary key,
sname varchar2(20) not null,
age number(3),
addr varchar2(50),
idcard number(18));

create table course(
cno number(4)primary key,
cname varchar2(20),
cscore number(2));

--创建外键约束的第一种方式
create table score(
stuno number(4) references student(sno),   --创建第一个外键约束
couno number(4) references course(cno),    --创建第二个外键约束
score number(5,2),
constraint pk_score primary key(stuno,couno));  --创建一个主键约束

--删除表及该表关联的约束
drop table score cascade constraints;

--创建外键约束的第二种方式
create table score(
stuno number(4) constraint fk_stuno references student(sno),  --创建第一个外键约束
couno number(4) constraint fk_couno references course(cno),   --创建第二个外键约束
score number(5,2),
constraint pk_score primary key(stuno,couno));

--创建外键约束的第三种方式
create table score(stuno number(4),
couno number(4),
score number(5,2),
constraint fk_stuno foreign key(stuno) references student(sno),
constraint fk_couno foreign key(couno) references course(cno),
constraint pk_score primary key(stuno,couno));

 

 

insert into student values(1001,'zhangsan',19,'henanluoyang',98765432123456789);

insert into student values(1002,'lisi',19,'henanluoyang',98765432123456789);

insert into student values(1003,'wangwu',19,'henanluoyang',98765432123456789);

--查看student表中所有内容

select * from student;

 

--往course表中插入2条记录

insert into course values(9999,'Java基础',4);

insert into course values(9998,'数据库基础',2);

--**查看course表中所有记录

select * from course;

 

--思考:insert into score values(1003,9997,89);能成功吗?不能,因为course表中不存在课程号为9997的课程

--**思考:insert into score values(1003,9998,89);能成功吗?可以,因为1003在student表中存在,9998在course表中存在

 

--**总结4:定义外键约束之后,删除父表中的记录,需要先将相关子表的记录删除

delete from student where sno=1003; --删除不掉,提示: 违反完整约束条件 (SYS.SYS_C0010808) - 已找到子记录

--**正确的做法:

delete from score where stuno=1003;  --先删子记录

delete from student where sno=1003;  --后删父记录

- 删除数据

子表中有关联的数据,需要先删子表,后删父表。

select * from parent;

wns9778.com 7

这里删除父表的id为2的是没关系的,只要没有子表和它关联就行

有关联的必须先删子表的数据,再删父表的数据

   

delete from parent where id=1;

wns9778.com 8

 

概要图

wns9778.com 9

外键的表级约束实现

父表:

create table parent(
  id number primary key,
  name varchar2(30),
);

wns9778.com 10

 

子表:

create table child(
  id number primary key,
  name varchar2(30),
  fid number,
  constraint child_fid_fk foreign key(fid) references parent(id),
);

 wns9778.com 11

1.5 检查约束(check)

条件(CHECK)约束:表中每行都要满足该约束条件。条件约束既可以在表一级定义也可以在列一级定义。在一列上可以定义任意多个条件约束。

CONSTRAINT constraint_name CHECK (logical_expression)

举例:

create table user4

(id number primary key,

sal number check(sal>=1000 and sal<=2000),

sex char(2) check(sex in('男','女')));

insert into user4 values(1,5000,'男');//sal列的值不满足1000至2000,报错。

概念

  • 一张表的一个字段受限于另外一张表的一个字段对应的值。这里涉及到两张表:被引用的表叫主表(父表),另外一张叫从表(子表)。
  • 它们的关系:主从表关系(父子表关系)
  • 子表:定义了外键的表

 外键的取值要么取父表中字段对应的值,要么取NULL值

 严重受限于父表

  • 父表:被引用的字段要具有唯一性(绝大多数都是用的父表的主键)

理论上是可以一张表里的一个字段引用另一个字段,但一般都是用两张表

wns9778.com 12

2.2 删除约束

当不再需要某个约束时,可以删除。删除约束基本语法:

alter table 表名 drop constratint 约束名称;

 

约束名称指的是:一个表的每一个约束都对应一个名称。约束名称用户没有设置时,系统会自动分配一个名称。

 

在删除主键约束的时候,可能有错误,比如:alter table 表名 drop primary key;这是因为如果在两张表存在主从关系,那么在删除主表的主键约束时,必需带上cascade 选项。

基本语法:

alter table 表名 drop primary key cascade;

 

演示:先删表,不管有没有

  (1)建立一张父表部门表

  • id number  primart  key  
  • name varchar2(30)

    create table mydept(   id nimber constraint mydept_pk primary key,   name varchar2(30), );

wns9778.com 13

 

(2)建立一张子表  员工表

  • id number  primart  key  
  • name varchar2(30)
  • dept_id number  外键(关联到部门表)
  • salary varchar2(30)

    

create table mtemp(
    id number constraint myepm_id_pk primary key,
  name varchar2(30),
  salary number,
  dept_id number constraint myemp_depy_id_fk reference mydept(id) on delete cascade,
);

wns9778.com 14

  

desc mtemp;

wns9778.com 15

 

(3)分别向两张表中放入数据

部门表:

insert into mydept values(1, 'test1');
insert into mydept values(2,'test2');

wns9778.com 16

 

select * from mydept;

wns9778.com 17

 

员工表:

insert into mtemp values(1, 'empa', 5000,1);
insert into mtemp values(2, 'empb', 4500,1);
insert into mtemp values(3, 'empc', 5500,1);
insert into mtemp values(4, 'empd', 5800,2);
insert into mtemp values(5, 'empe', 5100,2);

wns9778.com 18

 

select * from mtemp;

wns9778.com 19

              提交数据:commit;

 

 (4)因为有on  delete cascade,所以删除父表中的id为1的部分是可以的,并不会因为有关联而删不掉。

delete from mydept where id=1;

wns9778.com 20

 

select * from mydept;

wns9778.com 21

 

select * from mtemp;

wns9778.com 22

 

(5)如果换为on  delete set  null,所以删除父表中的id为1的部分是可以的,而子表的关联的相应部分置为空  

delete from mydept where id=1;

wns9778.com 23

  

select * from mydept;

wns9778.com 24

 

select * from mtemp;

wns9778.com 25

注意:如果是windows写在.sql脚本里,则所有以上的代码包括commit都写入,再在cmd切到存放脚本的磁盘(如D)。

wns9778.com 26

用ftp传到服务器上(192.168.0.26)

wns9778.com 27

  • 这里清屏用!cls
  • put  要传送的文件名把文件传送到服务器
  • @要执行的文件名执行文件
  • 在SQL>@/user/openlab/要执行的脚本文件

 

2.3 约束命名规范

约束名称:建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。    

约束命名规则: 

唯一约束:     UK_表名_列名  

主键约束:    PK_表名  

外键约束:     FK_表名_列名 

条件约束:    CK_表名_列名 

 

- 插入数据:

一般先插入父表数据,再插入子表数据。除非把子表的外键值设置成NULL值,否则会出完整性错误

insert into child values(1, 'test1', 1);

wns9778.com 28

 

要改为:先加入父表数据

insert into parent values(1, 'p1');
insert into parent values(2, 'p2');
insert into child values(1, 'test1', 1);

wns9778.com 29

 

1.1 主键约束

--什么是主键约束?主键约束就是给表定义一个主键,什么是主键?

--主键主要是用来保证表记录的唯一非空的。

--建表的时候添加主键

create table student(stuno number(4) primary key,stuname varchar2(10),age number(2),addr varchar(50));

insert into student values(1001,'zhang',18,'luoyang');

 

--再次插入相同记录,违法主键约束,不允许插入

SQL> insert into student values(1001,'zhang',18,'luoyang');

insert into student values(1001,'zhang',18,'luoyang')

ORA-00001: 违反唯一约束条件 (SYS.SYS_C0010797)

 

--如果主键为null也不允许插入,同样是违反了主键约束

SQL> insert into student values(null,'zhang',18,'luoyang');

insert into student values(null,'zhang',18,'luoyang')

--第一种
create table student2(
stuno number(5) primary key,
stuname varchar2(8),
age number(2),
addr varchar(50)
)
--第二种
create table student2(
stuno number(5) constraints pk_stuno primary key,
stuname varchar2(8),
age number(2),
addr varchar(50)
)
--第三种
create table student (
stuno number(5),
stuname varchar2(5),
age number(5),
addr varchar(50),
constraints pk_stuo primary key(stuno)
);

 

--创建一张课程表:

create table course(cno number(4) primary key,cname varchar2(20),cscore number(2));

--创建一张成绩表:学号和课程号共同作为一个主键,称为联合主键

--一张表只能有一个主键

create table score(sno number(4),cno number(4),score number(5,2),constraint pk_score primary key (sno,cno));

drop table course;

create table course(cno number(4) constraint pk_course primary key ,cname varchar2(20),cscore number(2));

作业:

  1. 删除表空间时,如何删除相关联的数据文件

drop tablespace test_data including contents and datafiles;

先建立表,后加外键

  • 子表s_emp :

里面有外键dept_id

  • 父表s_dept

查看脚本summit2_drop.sql发现:1270行

ALTER  TABLE s_emp
ADD  CONSTRAINT s_emp_dept_id_fk
FOREIGN  KEY (dept_id)  REFERENCES  s_dept(id);

2.1 添加约束

如果在建表时忘记建立必要的约束,则可以在建表后使用alter table命令为表增加约束;

注意:

1)增加not null约束使用modify(因为字段(列)默认都是可以为空)

2) 添加默认值 alter table emps modify deptno default 10

2)增加其它四种约束使用add。

1.添加not null约束

alter table 表名 modify 字段名 not null;

2.添加unique(唯一)、primary key(主键)、foreign key(外键)和check(检查)约束

alter table 表名 add constraint 约束名 约束种类(字段);

示例:
--添加主键约束
alter table stuInfo
add constraint PK_stuNo primary key(stuNo)
--添加唯一键约束
alter table stuInfo
add constraint UQ_stuID unique(stuID)
--添加默认约束
alter table emps modify deptno default 10
--添加检查约束
alter table stuInfo
add constraint CK_stuAge check(stuAge between 15 and 40)
--添加外键约束
alter table stuInfo
add constraint FK_stuNo foreign key(stuNo) references stuInfo(stuNo)

本文由wns9778.com发布于计算机教程,转载请注明出处:oracle-约束-序列

关键词: wns9778.com

上一篇:Web框架本质及初始Django框架

下一篇:没有了