Sql PK,FK约束设计

Sql PK,FK约束设计,sql,oracle11g,Sql,Oracle11g,我有以下表格结构 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...) 我希望表2中的N_EMP_ID是表1中的外键(N_EMP_ID)。 现在,这会产生以下错误:- 据我所知,所参考的表格在N_EMP_ID和D_M

我有以下表格结构

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...)
我希望表2中的N_EMP_ID是表1中的外键(N_EMP_ID)。 现在,这会产生以下错误:-

据我所知,所参考的表格在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约束:所得税(V_EMP_ID)
谢谢你的意见

下面是CREATETABLE语句

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" ;

员工应该是一个单独的表格,工资明细和所得税都要参考。通过这种方式,您可以消除冗余并修复FK问题。

请显示
salary\u details
表的完整
create table
语句。添加了一个没有名称的\u horse\u
salary\u details
中的主键由两列组成。不能通过只包含一列的FK引用包含两列的PK。为什么第一个PK的
D_MONTH
列是PK的一部分?这意味着您允许对不同的
D\u月
值使用相同的
V\u EMP\u ID
值?这对我来说似乎没有意义。@一匹没有名字的马将包含一个月的第一天,如2014年4月1日、2014年5月1日等。因此,我可以为多个员工提供月度工资详细信息,因此需要将
V\u EMP\u ID
D\u MONTH
作为主键列。这很有意义。谢谢@ammoQ。在这种情况下,对于
SALARY\u DETAILS
PK将保持为
V\u EMP\u ID
D\u MONTH
,FK将位于员工的
V\u EMP\u ID
上。对吗?谢谢@ammoQ。另外,在通过更改表收入税将列PERSON\u ID重命名为V\u EMP\u ID来更改
收入税
表时以便我可以将其FK应用于
员工
,我遇到了
ORA-02250
(缺少或无效的约束名称),尽管我对
人员ID
没有约束。对此有什么想法吗?从技术上讲,没有必要重命名该列。不过,为了保持一致性,您可能需要这样做。ORA-02550的原因可能是包含该表的现有主键约束。删除它并在重命名后重新创建它。奇怪。此表上没有主键约束
创建表“ANKUR”。“所得税”(“个人ID”VARCHAR2(10字节),“D_YEAR”日期非空启用,“N_所得税”编号(10,2))段创建延迟PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS日志记录表空间“USERS”