sql - PK、FK约束设计

标签 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...)

我希望 TABLE2 中的 N_EMP_ID 成为 TABLE1(N_EMP_ID) 上的外键。 现在这给出了以下错误:-

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

最佳答案

EMPLOYEES 应该是 SALARY_DETAILS 和 INCOME_TAX 都引用的单独表。这样,您可以消除冗余并解决 FK 问题。

关于sql - PK、FK约束设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712822/

相关文章:

sql - 在非过程语言中,什么规定了如何做事?

mysql - 顺序 sql 树层次结构

c# - 获取数据时出现异常 - C# 与 OracleDB

sql - 在查询中选择 2 个唯一列

oracle11g - 用于 Oracle 数据库源的 Kafka 连接器

忽略 MySQL 退出处理程序

sql - SQL 中根据结束时间与开始时间的匹配来组合顺序事件的最佳方法是什么?

mysql - 合并来自两个不同联结表的数据

for-loop - pl/sql循环记录select oracle plsql

java - 如何打印出将发送到 oracle 的 sql 查询