版权声明:如需转载,请注明出处 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;--删除主表数据
如有错误,欢迎指正!