2015-04-18 162 views
3

我有以下表結構。PK,FK約束設計

TABLE1 
SALARY_DETAILS(N_EMP_ID, D_MONTH ...) 
N_EMP_ID NUMBER 
D_MONTH DATE 

PRIMARY KEY being composite: N_EMP_ID,D_MONTH 

TABLE 2 
INCOME_TAX(N_EMP_ID,D_YEAR,N_TAX...) 

我希望TABLE2中的N_EMP_ID成爲TABLE1(N_EMP_ID)上的FOREIGN KEY。 現在這提供了以下錯誤: -

error

我懂表被稱爲具有兩個N_EMP_ID和D_MONTH PK。 很顯然,我不應該這樣做下面。

ALTER TABLE income_tax ADD FOREIGN KEY (person_id) REFERENCES salary_details(V_EMP_ID,D_MONTH); 
  • 問題1:什麼是正確的方法/設計解決這一問題?
  • 問題2:我可以在同一列上同時具有PK和FK約束:INCOME_TAX(V_EMP_ID)?

感謝您的輸入。

這是Create table語句。

CREATE TABLE "ANKUR"."SALARY_DETAILS" 
    ( 
    "V_EMP_NAME" VARCHAR2(30 BYTE), 
    "D_MONTH" DATE NOT NULL ENABLE, 
    "V_EMP_ID" VARCHAR2(10 BYTE), 
    "N_NET_PAY" NUMBER(10,2), 
    "N_TOT_EARNINGS" NUMBER(10,2), 
    "N_TOT_DED" NUMBER(10,2), 
    "N_BAS_SAL" NUMBER(10,2), 
    "N_FDA" NUMBER(10,2), 
    "N_HRA" NUMBER(10,2), 
    "N_MED_ALLW" NUMBER(10,2), 
    "N_TRANS_ALLW" NUMBER(10,2), 
    "N_LTA" NUMBER(10,2), 
    "N_BON_EXGRA_ADV" NUMBER(10,2), 
    "N_ANN_BON_EXGRA" NUMBER(10,2), 
    "N_PERF_BON" NUMBER(10,2), 
    "N_LWF" NUMBER(10,2), 
    "N_INCM_TAX" NUMBER(10,2), 
    "N_INFY_WELTRUST" NUMBER(10,2), 
    "N_MLPL" NUMBER(10,2), 
    "N_LIB_DEDUC" NUMBER(10,2), 
    "N_PF" NUMBER(10,2), 
    CONSTRAINT "PK_PERSON" PRIMARY KEY ("V_EMP_ID", "D_MONTH") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "USERS" ENABLE 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "USERS" ; 
+0

請爲'salary_details'表顯示* complete *'create table'語句。 –

+0

已添加a_horse_with_no_name – Ankur

+0

「salary_details」中的PK包含**兩個**列。你不能通過只有** 1 **列的FK引用具有兩列的PK。爲什麼PK首先是D_MONTH列的一部分?這意味着你允許**不同'D_MONTH'值的**相同**'V_EMP_ID'值?這對我來說似乎沒有意義。 –

回答

4

僱員應該是SALARY_DETAILS和INCOME_TAX都提到的單獨表。這樣,您可以消除冗餘,並解決您的FK問題。

+0

有道理。謝謝@ammoQ。在這種情況下,對於'SALARY_DETAILS',PK將保持爲'V_EMP_ID','D_MONTH'和FK將在'EMPLOYEES的'V_EMP_ID'上。對? – Ankur

+0

@Ankur:的確如此。 –

+0

謝謝@ammoQ。此外,在將'INCOME_TAX'表改爲'ALTER TABLE INCOME_TAX RENAME COLUMN PERSON_ID TO V_EMP_ID;'以便我可以將它的FK應用於'EMPLOYESS'時,我碰到了'ORA-02250'(缺少或無效的約束名)對'PERSON_ID'沒有限制。對此有任何想法。 – Ankur