数据sql设置外键约束

本文详细介绍了数据库中的主从表关系,强调了外键的概念及其作用。通过实例展示了如何创建和管理带有外键的表,以及如何进行数据插入、删除操作。同时,讨论了级联删除和级联置空的实现,帮助理解外键在数据完整性和一致性中的重要性。
摘要由CSDN通过智能技术生成

概念

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

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

 严重受限于父表

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

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

外键的实现

  • 建立表:

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

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

父表:

1

2

3

4

5

create table parent(

  id number primary key,

  name varchar2(30),

);

  

子表:

1

2

3

4

5

create table child(

  id number primary key,

  name varchar2(30),

  fid number constraint child_fid_fk references parent(id),

);

  • 插入数据:

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

1

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

要改为:先加入父表数据

1

2

3

insert into parent values(1, 'p1');

insert into parent values(2, 'p2');

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

  • 删除数据

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

1

select from parent;

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

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

   

1

delete from parent where id=1;

  • 删除表

先删子表,后删父表

除非使用casecade  constraints  解除关联

1

drop table parent;

 

先删父表会出错:

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

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

1

drop table parent cascade constranints;

外键的表级约束实现

父表:

1

2

3

4

create table parent(

  id number primary key,

  name varchar2(30),

);

子表:

1

2

3

4

5

6

create table child(

  id number primary key,

  name varchar2(30),

  fid number,

  constraint child_fid_fk foreign key(fid) references parent(id),

);

 

先建立表,后加外键

  • 子表s_emp :

里面有外键dept_id

  • 父表s_dept

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

1

2

3

ALTER  TABLE s_emp

ADD  CONSTRAINT s_emp_dept_id_fk

FOREIGN  KEY (dept_id)  REFERENCES  s_dept(id);

级联删除和级联置空

  • 级联删除:

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

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

  • 级联置空

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

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

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

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

  • id number  primart  key  
  • name varchar2(30)

1

2

3

4

create table mydept(

  id nimber constraint mydept_pk primary key,

  name varchar2(30),

);

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

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

    

1

2

3

4

5

6

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,

);

  

1

desc mtemp;

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

部门表:

1

2

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

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

1

select from mydept;

员工表:

1

2

3

4

5

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

1

select from mtemp;

              提交数据:commit;

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

1

delete from mydept where id=1;

1

select from mydept;

1

select from mtemp;

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

1

delete from mydept where id=1;

  

1

select from mydept;

1

select from mtemp;

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

用ftp传到服务器上(192.168.0.26)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024小神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值