oracle(29)_SQL_约束_外键约束

版权声明:如需转载,请注明出处 https://blog.csdn.net/qq_36260974/article/details/88838386

SQL

约束

  • 在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。
外键约束
  • 之前所讲的都是单表的约束,外键是两张表的约束,可以保证关联数据的 完整性
  • 我们在两张表中插入数据时,如果没有主外键关系,我们发现在 order_detail 表中插入的 order_id 在 order 表中并不存在,这样在数据库中就产生了脏数据,此时需要外键来约束它。
  • 范例:创建两张表,一张订单表,一张是订单明细表,建立主外键关系,订单表和明细表是一对多的关系。
  • 示例图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 示例图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

外键关联一定注意:

  • 外键一定是主表的主键!
  • 删表时一定先删字表再删主表,如果直接删主表会出现由于约束存在无法删除的问题!
  • 虽然可以强制删除 drop table orders cascade constraint; 但不建议!
  • 示例图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 删除主表的数据可以删除子表的关联数据,再删主表,也可以使用级联删除级联删除在外键约束上要加上on delete cascade 如:
    在这里插入图片描述
    这样删除主表数据的时候会把字表的关联数据一同删除!

以上操作,完整源码:

--订单表
create table orders(
       order_id   number(4),
       totalPrice number(7,2),--7位总长度,两位小数
       order_time date,
       constraint orders_order_id_pk primary key(order_id)
);

--订单明细表
create table order_detail(
       detail_id  number(4),
       item_name  varchar2(10),
       price      number(7,2),--7位总长度,两位小数
       quantity   number(4),
       order_id   number(4),
       constraint order_detail_detail_id_pk primary key(detail_id),
       constraint order_detail_order_id_fk foreign key(order_id) references orders(order_id)
);

--插入数据
insert into orders values(1000, 10000, sysdate); 
insert into order_detail values(1000, 'iPhone', 5000, 2, 1000);--子表插入时有外键约束

--查询
select * from orders ;
select * from order_detail;


delete from orders--主表删除数据时有外键约束,如果想要删除需要先删除子表的数据再删主表

drop table orders;--主表删除时受外键的约束,需要先删除子表再删主表

drop table orders cascade constraint;--不建议这样删除


--在建表的时候就设置好级联删除(主表数据被删除,字表关联的数据也会被删除)
create table orders(
       order_id   number(4),
       totalPrice number(7,2),
       order_time date,
       constraint orders_order_id_pk primary key(order_id)
);
create table order_detail(
       detail_id  number(4),
       item_name  varchar2(10),
       price      number(7,2),
       quantity   number(4),
       order_id   number(4),
       constraint order_detail_detail_id_pk primary key(detail_id),
       constraint order_detail_order_id_fk foreign key(order_id)
       references orders(order_id) on delete cascade --级联删除设置
);

delete from orders;--删除主表数据

如有错误,欢迎指正!

猜你喜欢

转载自blog.csdn.net/qq_36260974/article/details/88838386