外鍵的取值要麼取父表中字段對應的值,要麼取NULL值sql
嚴重受限於父表windows
理論上是能夠一張表裏的一個字段引用另外一個字段,但通常都是用兩張表服務器
先創建父表,後創建子表(由於子表要用到父表)spa
除非先不考慮外鍵(建完表後再加),表多的時候能夠不考慮建表順序。弊端:對數據要求很嚴格,一個垃圾數據都不能放3d
父表:blog
create table parent( id number primary key, name varchar2(30), );
子表:cmd
create table child( id number primary key, name varchar2(30), fid number constraint child_fid_fk references parent(id), );
通常先插入父表數據,再插入子表數據。除非把子表的外鍵值設置成NULL值,不然會出完整性錯誤。it
insert into child values(1, 'test1', 1);
要改成:先加入父表數據table
insert into parent values(1, 'p1'); insert into parent values(2, 'p2'); insert into child values(1, 'test1', 1);
子表中有關聯的數據,須要先刪子表,後刪父表。class
select * from parent;
這裏刪除父表的id爲2的是不要緊的,只要沒有子表和它關聯就行
有關聯的必須先刪子表的數據,再刪父表的數據
delete from parent where id=1;
先刪子表,後刪父表
除非使用casecade constraints 解除關聯
drop table parent;
先刪父表會出錯:
有一個被foreign keys關聯的unique/primary key的字段在表中
使用casecade constraints解除關聯就能夠刪掉父表
drop table parent cascade constranints;
父表:
create table parent( id number primary key, name varchar2(30), );
子表:
create table child( id number primary key, name varchar2(30), fid number, constraint child_fid_fk foreign key(fid) references parent(id), );
裏面有外鍵dept_id
查看腳本summit2_drop.sql發現:1270行
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)創建一張父表部門表
create table mydept( id nimber constraint mydept_pk primary key, name varchar2(30), );
(2)創建一張子表 員工表
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, );
desc mtemp;
(3)分別向兩張表中放入數據
部門表:
insert into mydept values(1, 'test1'); insert into mydept values(2,'test2');
select * from mydept;
員工表:
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);
select * from mtemp;
提交數據:commit;
(4)由於有on delete cascade,因此刪除父表中的id爲1的部分是能夠的,並不會由於有關聯而刪不掉。
delete from mydept where id=1;
select * from mydept;
select * from mtemp;
(5)若是換爲on delete set null,因此刪除父表中的id爲1的部分是能夠的,而子表的關聯的相應部分置爲空
delete from mydept where id=1;
select * from mydept;
select * from mtemp;
注意:若是是windows寫在.sql腳本里,則全部以上的代碼包括commit都寫入,再在cmd切到存放腳本的磁盤(如D)。
用ftp傳到服務器上(192.168.0.26)