iT邦幫忙

1

募的地專題開發日誌3-Oracle DB的外鍵

今天原本要繼續研究爬蟲,使我們的資料庫內的資料更為逼真(其實大可不必XD),殊不知全忘了資料庫的外鍵還沒建置完成,一經提醒只好立馬開工。整個晚上就這樣飛走了,走了不少冤望路...

資料庫外鍵的建立

還好後來總算把資料庫的語法稍稍微搞懂了,最剛開始是外鍵沒設,只建立了表格、自增主鍵、一些假資料。這樣是很爽沒錯,咻~~一聲組員的資料收一收,小bug修一下,就這樣建好了。還想說其實挺簡單的啊!但是加上外鍵時才是痛苦的開始...

先說結論

最後,我把資料庫的建立分成三部分

  • 表格(需注意建立先後)、自增主鍵
  • 外鍵
  • 假資料(需注意輸入先後)

這樣做能降低相依性,也能分段debug,另外請組員交資料時,也才不會全部混在一起而提高整合的難度。不過這些都是摸索最後才得到的結論啦QAQ

愛搗亂的外鍵

因為有了為外鍵,表格們就有了階層的關係。例如:會員與活動。一定要先有這個會員才能報名活動吧!可是啊...我們的表格算一算30個出頭,也是個大工程啊!

基本語法

表格(需注意建立先後)、自增主鍵

這邊我是拆開解釋,我的做法是在DROP TABLE的部分,會依照表格階層逆向排序。再來是DROP SEQUENCE一區,最後是各個TABLE的建立。

DROP TABLE MEM;
DROP SEQUENCE MEM_seq;
CREATE TABLE MEM (
 MEM_NO              VARCHAR2(45) NOT NULL,
 MEM_ACC             VARCHAR2(45),
 MEM_PWS             VARCHAR2(20),
 MEM_NAME            VARCHAR2(20),
 MEM_NICKNAME        VARCHAR2(60),
 MEM_PHONE           VARCHAR2(20),
 MEM_TEL             VARCHAR2(20),
 MEM_EMAIL           VARCHAR2(200),
 MEM_ADRS            VARCHAR2(200),
 MEM_STATUS          VARCHAR2(5),
 LOVE_POINTS         VARCHAR2(200),

 CONSTRAINT MEM_KEY PRIMARY KEY (MEM_NO));

CREATE SEQUENCE MEM_seq
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
NOCACHE;

外鍵

外鍵的建立因為將資料的書放到最後的關係,變得比較簡單,下面的語法是在表格建立後所使用的。

-- 公益活動
ALTER TABLE ACTIVITY ADD CONSTRAINT ACT_FK1 FOREIGN KEY (FDN_NO) REFERENCES FUNDATION(FDN_NO);
ALTER TABLE ACTIVITY ADD CONSTRAINT ACT_FK2 FOREIGN KEY (ACT_SNO) REFERENCES ACTIVITY_SORT (ACT_SNO);
ALTER TABLE ACTIVITY ADD CONSTRAINT ACT_FK3 FOREIGN KEY (ADM_NO) REFERENCES ADM(ADM_NO);

假資料(需注意輸入先後)

輸入假資料的部分則是要依照表格階層順向排序,這邊我是分成LEVEL1~5來分區,以降低整合的難度。

------------
-- LEVEL1 --
------------
-- ADM 管理員
INSERT INTO ADM (ADM_NO, ADM_ACC, ADM_PSW, ADM_NAME, ADM_STATUS) VALUES ('A'||LPAD(to_char(ADM_seq.NEXTVAL), 6, '0'), 'ADM1', '123456', '史瑞克', '1');
INSERT INTO ADM (ADM_NO, ADM_ACC, ADM_PSW, ADM_NAME, ADM_STATUS) VALUES ('A'||LPAD(to_char(ADM_seq.NEXTVAL), 6, '0'), 'ADM2', '123456', '史迪奇', '1');
INSERT INTO ADM (ADM_NO, ADM_ACC, ADM_PSW, ADM_NAME, ADM_STATUS) VALUES ('A'||LPAD(to_char(ADM_seq.NEXTVAL), 6, '0'), 'ADM3', '123456', '史努比', '1');
INSERT INTO ADM (ADM_NO, ADM_ACC, ADM_PSW, ADM_NAME, ADM_STATUS) VALUES ('A'||LPAD(to_char(ADM_seq.NEXTVAL), 6, '0'), 'ADM4', '123456', '史萊姆', '1');
INSERT INTO ADM (ADM_NO, ADM_ACC, ADM_PSW, ADM_NAME, ADM_STATUS) VALUES ('A'||LPAD(to_char(ADM_seq.NEXTVAL), 6, '0'), 'ADM5', '123456', '史考特', '1');

小結

好累啊~~~兩點多惹!


尚未有邦友留言

立即登入留言