您的位置:68399皇家赌场 > 虚拟主机 > 澳门皇家赌场55533网址:外键约束

澳门皇家赌场55533网址:外键约束

发布时间:2019-05-03 21:48编辑:虚拟主机浏览(127)

    - 建立表:

    先创建父表,后建设构造子表(因为子表要用到父表)

    只有先不思量外键(建完表后再加),表多的时候能够不思虑建表顺序。弊端:对数据须求很严俊,二个吐弃物数据都不可能放

    父表:

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

    澳门皇家赌场55533网址 1

      

    子表:

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

    澳门皇家赌场55533网址 2

    一 约束

    --问题:往表中插入数据的时候,大概出现局地难题,比方:重复插入数据,内容不对(性别)

    --怎么着确定保证数据库表中数据的完整性和壹致性呢?

    约束是强加在表上的规则或规范,确认保证数据库满意职业规则,保障数据的完整性。

    封锁又分为列约束(Column Constraint)和表约束(Table Constraint)。列约束作为列定义的1局地只服从于此列本人。表约束作为表定义的一片段,可以功用于多个列

    --常见的束缚:主键(primary key),外键(foreign key),唯一(unique),非空(not null),默认(default),用户自定义(check)

    外键约束的三种特有处境(主键删除有级联)
    alter table e add constraint fk_e_deptno foreign key(deptno) references dept (deptno) on delete set null;

    - 删除数据

    子表中有涉及的数额,必要先删子表,后删父表。

    select * from parent;
    

    澳门皇家赌场55533网址 3

    此间删除父表的id为贰的是没什么的,只要未有子表和它事关就行

    有关系的总得先删子表的多少,再删父表的多少

       

    delete from parent where id=1;
    

    澳门皇家赌场55533网址 4

     

    2.5表级约束和列级约束

    n  列级约束

    列级约束:是在概念列的还要定义约束。

    举个例子来讲:即便在department表定义主键约束

    create table department(

    dept_id number(12) constraint pk_department primary key,

    name varchar2(12), loc varchar2(12));

    n  表级约束

    表级定义:指在概念了具有列后,再定义约束。

    比如:创立employee表时定义主键约束和外键约束为例:

    create table employee(emp_id number(4),

    name varchar2(15),

    dept_id number(2),

    constraint pk_employee primary key (emp_id),

    constraint fk_department foreign key (dept_id) references department4(dept_id)

    );

    专门表明:not null约束不能出现在表级定义中,not null约束只可以在列级上定义。

    一般景观下,大家选拔列级定义就能够。不过如果蒙受定义复合主键(两列一同被定义为主键)时,供给利用表级定义。

     

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

      (一)创建一张父表部门表

    • id number  primart  key  
    • name varchar2(30)

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

    澳门皇家赌场55533网址 5

     

    (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,
    );
    

    澳门皇家赌场55533网址 6

      

    desc mtemp;
    

    澳门皇家赌场55533网址 7

     

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

    部门表:

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

    澳门皇家赌场55533网址 8

     

    select * from mydept;
    

    澳门皇家赌场55533网址 9

     

    员工表:

    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);
    

    澳门皇家赌场55533网址 10

     

    select * from mtemp;
    

    澳门皇家赌场55533网址 11

                  提交数据:commit;

     

     (四)因为有on  delete cascade,所以删除父表中的id为1的一些是能够的,并不会因为关于联而删不掉。

    delete from mydept where id=1;
    

    澳门皇家赌场55533网址 12

     

    select * from mydept;
    

    澳门皇家赌场55533网址 13

     

    select * from mtemp;
    

    澳门皇家赌场55533网址 14

     

    (5)假使换为on  delete set  null,所以删除父表中的id为一的一部分是足以的,而子表的关联的照顾部分置为空  

    delete from mydept where id=1;
    

    澳门皇家赌场55533网址 15

      

    select * from mydept;
    

    澳门皇家赌场55533网址 16

     

    select * from mtemp;
    

    澳门皇家赌场55533网址 17

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

    澳门皇家赌场55533网址 18

    用ftp传到服务器上(1玖2.16捌.0.贰6)

    澳门皇家赌场55533网址 19

    • 此处清屏用!cls
    • put  要传递的文本名把文件传送到服务器
    • @要奉行的文书名执行文书
    • 在SQL>@/user/openlab/要实施的本子文件

     

    贰.肆 彰显约束新闻

    一)展现表约束消息

    经过询问数据字典视图user_constraints,能够体现当前用户具有的封锁的新闻。

    语法:

    select constraint_name, constraint_type, status, validated

    from user_constraints

    where table_name = '表名';

    在意:表名要大写

    Type Code

    Type Description

    Acts On Level

    C

    Check on a table

    Column

    O

    Read Only on a view

    Object

    P

    Primary Key

    Object

    R

    Referential AKA Foreign Key

    Column

    U

    Unique Key

    Column

    V

    Check Option on a view

    Object

     

    2)当然也有更便于的艺术,直接用pl/sql developer查看就可以。

     

    先创制表,后加外键

    • 子表s_emp :

    个中有外键dept_id

    • 父表s_dept

    翻开脚本summit二_drop.sql发现:1270行

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

    二.6 联合主键

    比方,将id与name定义为复合主键:

    create table test(id number,

        name varchar2(64),nums number,

        constraint pk_id_name primary key(id,name));

    特别表达:不引入我们使用复合主键。

     

    create table d as select * from dept;

    - 布置数据:

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

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

    澳门皇家赌场55533网址 20

     

    要改为:先加入父表数据

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

    澳门皇家赌场55533网址 21

     

    贰 约束管理

    测试数据信赖关系:
    delete dept where deptno=40;

    外键的兑现

    一.四 非空约束(not null)

    非空(NOT NULL)约束:顾名思义,所羁绊的列不可能为NULL值。不然就能报错 。

    举例:

    create table user1(id number,name varchar2(30) not null);

    insert into user1 values(001,'');//会报错

    创制表的时候带有约束音信:
    create table e (empno number(4) constraint pk_e_empno(约束名) primary key,
    ename varchar贰(十) not null, not null只辛亏列等第
    email varchar2(30),
    constraint uk_e_email unique (email)); 约束写在后面为表等级约束,要钦定列名

    级联删除和级联置空

    澳门皇家赌场55533网址 22

    • 级联删除:

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

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

    • 级联置空

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

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

    三 序列

    序列是何等?做什么用的?怎么用?须求小心怎么着内容?

    --体系是哪些?有序的数字组成的三个排列   1 2 三 4 ⑤ 6 7

    --做什么用?类别是一个独门的数据库对象,首要用来扭转主键

    --怎么用?

    --创建序列:
    
    create sequence seq01 --seq01序列名
    
    start with 3          --序列的起始值
    
    increment by 1        --步长
    
    maxvalue 9999         --序列的最大值
    
    minvalue 0            --序列的最小值
    
    nocycle               --nocycle(表示序列不循环)|cycle(表示序列循环使用)
    
    cache 20;             --cache 20(为了加快序列的生成速度,每次生成20个值,放到缓存中)|nocache(不往缓存中存放序列值,使用一次,生成一次)
    
    
    
    --currval:返回序列的当前值,不会引起序列自增
    
    --nextval:返回序列的下一个值,会引起序列自增
    
    --查看序列的下一个值,会引起序列自增
    
    select seq01.nextval from dual;--第一次使用序列的时候,必须使用 序列名.nextval
    
    --查看序列的当前值
    
    select seq01.currval from dual;
    
    
    
    --序列的使用:
    
    insert into student values(seq01.nextval,'zhang','男',18,'河南信阳','123456789987654321');
    
    
    
    --注意事项:一个sequence可以供多张表使用的。可能造成主键值的不连续。
    
    
    
    --删除序列:
    
    drop sequence seq01;
    

     

    select table_name,constraint_type from user_constraints where constraint_name='PK_DEPT';

    概念

    • 一张表的一个字段受限于此外一张表的二个字段对应的值。这里提到到两张表:被引用的表叫主表(父表),此外一张叫从表(子表)。
    • 它们的涉嫌:主从表关系(父子表关系)
    • 子表:概念了外键的表

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

     严重受限于父表

    • 父表:被引用的字段要具有唯1性(绝大诸多都以用的父表的主键)

    辩解上是能够一张表里的贰个字段引用另1个字段,但貌似都是用两张表

    澳门皇家赌场55533网址 23

    2.三 约束命名标准

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

    封锁命名规则: 

    唯一约束:     UK_表名_列名  
    
    主键约束:    PK_表名  
    
    外键约束:     FK_表名_列名 
    
    条件约束:    CK_表名_列名 
    

     

     

    - 删除表

    先删子表,后删父表

    唯有动用casecade  constraints  解除关系

    drop table parent;
    

     澳门皇家赌场55533网址 24

    先删父表会出错:

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

     

    动用casecade  constraints解除关系就足以删掉父表

    drop table parent cascade constranints;
    

    澳门皇家赌场55533网址 25

    澳门皇家赌场55533网址 26

    1.5 检查约束(check)

    条件(CHECK)约束:表中每行都要满意该约束原则。条件约束既能够在表一流定义也得以在列一级定义。在1列上能够定义任性七个规范化约束。

    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,报错。
    

    alter table e add constraint fk_e_deptno foreign key(deptno) references d (deptno);

    外键的表级约束达成

    父表:

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

    澳门皇家赌场55533网址 27

     

    子表:

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

     澳门皇家赌场55533网址 28

    一.陆 外键约束(froeign key)

    外键(FOREIGN KEY)约束:用来爱抚从表(Child Table)和主表(Parent Table)之间的引用完整性。能够保护数据库的数目1致性,数据的完整性。幸免错误的垃圾数据入库;

    用于定义主表和从表之间的涉嫌,外键约束要定义在从表上,主表则少不了具有主键约束或是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)
    
    );
    

    注意

    一.外键指向主键列;

    二.外键能够指向unique列;

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

    四.外键列属性值要与主键或unique列属性值的门类保持1致

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

    6.ON DELETE {CASCADE | NO ACTION}钦点在剔除表中数据时,对关联表所做的相干操作。在子表中有数据行与父表中的对应数据行相关联的情事下,借使内定了值CASCADE,则在剔除父表数据行时会将子表中对应的数据行删除;假诺钦定的是NO ACTION,则SQL Server 会发生1个错误,并将父表中的删除操作回滚。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(999捌,'数据库基础',二);

    --**查看course表中具备记录

    select * from course;

     

    --考虑:insert into score values(100三,99玖柒,8九);能成功吧?不能够,因为course表中不存在学科号为99玖7的课程

    --**思索:insert into score values(十0三,99玖捌,8玖);能成功吗?能够,因为拾0三在student表中存在,99九8在course表中留存

     

    --**总计肆:定义外键约束之后,删除父表中的记录,须要先将有关子表的笔录删除

    delete from student where sno=1003; --删除不掉,提醒: 违反完整约束标准(SYS.SYS_C00拾80八) - 已找到子记录

    --**正确的做法:

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

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

     

    概要图

    澳门皇家赌场55533网址 29

    禁止约束:
    alter table e modify constraint UK_E_EMAIL disable;

    二.一 增多约束

    假设在建表时忘记创设须求的羁绊,则能够在建表后接纳alter table命令为表扩充约束;

    注意:

    一)扩大not null约束使用modify(因为字段(列)暗中同意都以足以为空)

    二) 加多默许值 alter table emps modify deptno default 拾

    二)增添别的各样约束使用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)
    

     

    一.一 主键约束

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

    --主键首假若用来保险表记录的唯一非空的。

    --建表的时候增进主键

    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-0000壹: 违反唯一约束原则 (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));

    --创设一张成绩表:学号和学科号共同作为3个主键,称为联合主键

    --一张表只可以有3个主键

    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;

    alter table e add constraint fk_e_deptno foreign key(deptno) references dept (deptno);

    一.二 非空约束(not null)

    非空(NOT NULL)约束:顾名思义,所羁绊的列不可能为NULL值。不然就能报错 。

    举例:

    create table user1(id number,name varchar2(30) not null);
    
    insert into user1 values(001,'');//会报错
    

     

    翻看约束音讯:
    select constraint_name,
    constraint_type,
    SEARCH_CONDITION,
    R_CONSTRAINT_NAME
    from user_constraints
    where table_name='E';

    1.7 默认值(default)

    CONSTRAINT constraint_name

     DEFAULT constant_expression [FOR column_name]

    举例:

    Create table stu(
    
    id number primary key,
    
    address varchar2(50) default ‘宿舍’);
    
    insert into stu(id)  values(1);
    

     

     

    删除此而外键,重新树立老爹和儿子关系(子表为e,父表为d,d表拷贝dept表数据):
    alter table e drop constraint fk_e_deptno;

    一.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));
    

     

    primary key与unique的区别:

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

    二.一张表只可以有二个主键;

    三.安装为主键的列不可能有null值;

     

    本文由68399皇家赌场发布于虚拟主机,转载请注明出处:澳门皇家赌场55533网址:外键约束

    关键词: 68399皇家赌场 oracle oacle

上一篇:Java JDBC 操作

下一篇:没有了