天天看點

oracle(29)_SQL_限制_外鍵限制

SQL

限制

  • 在資料庫開發中,限制是必不可少,使用限制可以更好的保證資料的完整性。
外鍵限制
  • 之前所講的都是單表的限制,外鍵是兩張表的限制,可以保證關聯資料的 完整性。
  • 我們在兩張表中插入資料時,如果沒有主外鍵關系,我們發現在 order_detail 表中插入的 order_id 在 order 表中并不存在,這樣在資料庫中就産生了髒資料,此時需要外鍵來限制它。
  • 範例:建立兩張表,一張訂單表,一張是訂單明細表,建立主外鍵關系,訂單表和明細表是一對多的關系。
  • 示例圖:
    oracle(29)_SQL_限制_外鍵限制
    oracle(29)_SQL_限制_外鍵限制
    oracle(29)_SQL_限制_外鍵限制
  • oracle(29)_SQL_限制_外鍵限制
    oracle(29)_SQL_限制_外鍵限制
    oracle(29)_SQL_限制_外鍵限制
  • 外鍵一定是主表的主鍵!
  • 删表時一定先删字表再删主表,如果直接删主表會出現由于限制存在無法删除的問題!
  • 雖然可以強制删除 drop table orders cascade constraint; 但不建議!
  • oracle(29)_SQL_限制_外鍵限制
    oracle(29)_SQL_限制_外鍵限制
    oracle(29)_SQL_限制_外鍵限制
  • 删除主表的資料可以删除子表的關聯資料,再删主表,也可以使用級聯删除級聯删除在外鍵限制上要加上on delete cascade 如:
    oracle(29)_SQL_限制_外鍵限制
    這樣删除主表資料的時候會把字表的關聯資料一同删除!
--訂單表
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;--删除主表資料