【发布时间】:2018-09-28 16:41:44
【问题描述】:
我从一个同事那里继承了一系列 SQL 脚本,我每年运行几次,现在已经有几年了。这一次,我遇到了一个我从未见过的错误。代码如下:
/* First drop and then create table scbcrse_xref */
DROP TABLE ddef_stag.SCBCRSE_XREF;
CREATE TABLE ddef_stag.SCBCRSE_XREF AS SELECT
ddef_stag.SSBSECT.ssbsect_term_code,
ddef_stag.SSBSECT.ssbsect_crn,
ddef_stag.SSBSECT.ssbsect_subj_code,
ddef_stag.SSBSECT.ssbsect_crse_numb,
MAX(ddef_stag.SCBCRSE.scbcrse_eff_term) "SCBCRSE_MAX_EFF_TERM"
FROM ddef_stag.SCBCRSE, ddef_stag.SSBSECT
WHERE ddef_stag.SCBCRSE.scbcrse_subj_code = ddef_stag.SSBSECT.ssbsect_subj_code AND
ddef_stag.SCBCRSE.scbcrse_crse_numb = ddef_stag.SSBSECT.ssbsect_crse_numb AND
ddef_stag.SCBCRSE.scbcrse_eff_term <= ddef_stag.SSBSECT.ssbsect_term_code
GROUP BY ddef_stag.SSBSECT.ssbsect_term_code, ddef_stag.SSBSECT.ssbsect_crn,
ddef_stag.SSBSECT.ssbsect_subj_code, ddef_stag.SSBSECT.ssbsect_crse_numb;
-----------------------------------------------------------------------------
/* Add foreign key constraint on scbcrse_xref */
ALTER TABLE ddef_stag.SCBCRSE_XREF ADD
CONSTRAINT SCBCRSE_XREF_SSBSECT_FK
FOREIGN KEY (ssbsect_term_code, ssbsect_crn)
REFERENCES SSBSECT(ssbsect_term_code, ssbsect_crn);
-----------------------------------------------------------------------------
/* Add foreign key constraint on scbcrse_xref */
ALTER TABLE ddef_stag.SCBCRSE_XREF ADD
CONSTRAINT SCBCRSE_XREF_SCBCRSE_FK
FOREIGN KEY (ssbsect_subj_code, ssbsect_crse_numb, scbcrse_max_eff_term)
REFERENCES SCBCRSE (scbcrse_subj_code, scbcrse_crse_numb, scbcrse_eff_term);
两个外键约束都给出错误: ORA-02270: 此列列表没有匹配的唯一键或主键
查看 SCBCRSE 和 SSBSECT 的表信息,它们看起来好像启用了正确的主键。我查看了 SCBCRSE 和 SSBSECT,这两个表之间的连接没有明显的问题。出了什么问题?我还能检查什么?
编辑:我被要求发布所涉及表的 describe():
describe scbcrse
TABLE scbcrse
Name Null? Type
----------------------------------------- -------- ----------------------------
SCBCRSE_SUBJ_CODE NOT NULL VARCHAR2(16)
SCBCRSE_CRSE_NUMB NOT NULL VARCHAR2(20)
SCBCRSE_EFF_TERM NOT NULL VARCHAR2(24)
SCBCRSE_COLL_CODE VARCHAR2(8)
SCBCRSE_DIVS_CODE VARCHAR2(16)
SCBCRSE_DEPT_CODE VARCHAR2(16)
SCBCRSE_CSTA_CODE VARCHAR2(4)
SCBCRSE_TITLE VARCHAR2(120)
SCBCRSE_CIPC_CODE VARCHAR2(24)
SCBCRSE_CREDIT_HR_IND VARCHAR2(8)
SCBCRSE_CREDIT_HR_LOW NUMBER(7,3)
SCBCRSE_CREDIT_HR_HIGH NUMBER(7,3)
SCBCRSE_LEC_HR_IND VARCHAR2(8)
SCBCRSE_LEC_HR_LOW NUMBER(7,3)
SCBCRSE_LEC_HR_HIGH NUMBER(7,3)
SCBCRSE_LAB_HR_IND VARCHAR2(8)
SCBCRSE_LAB_HR_LOW NUMBER(7,3)
SCBCRSE_LAB_HR_HIGH NUMBER(7,3)
SCBCRSE_OTH_HR_IND VARCHAR2(8)
SCBCRSE_OTH_HR_LOW NUMBER(7,3)
SCBCRSE_OTH_HR_HIGH NUMBER(7,3)
SCBCRSE_BILL_HR_IND VARCHAR2(8)
SCBCRSE_BILL_HR_LOW NUMBER(7,3)
SCBCRSE_BILL_HR_HIGH NUMBER(7,3)
SCBCRSE_APRV_CODE VARCHAR2(4)
SCBCRSE_REPEAT_LIMIT NUMBER(2)
SCBCRSE_PWAV_CODE VARCHAR2(4)
SCBCRSE_TUIW_IND VARCHAR2(4)
SCBCRSE_ADD_FEES_IND VARCHAR2(4)
SCBCRSE_ACTIVITY_DATE DATE
SCBCRSE_CONT_HR_LOW NUMBER(7,3)
SCBCRSE_CONT_HR_IND VARCHAR2(8)
SCBCRSE_CONT_HR_HIGH NUMBER(7,3)
SCBCRSE_CEU_IND VARCHAR2(4)
SCBCRSE_REPS_CODE VARCHAR2(8)
SCBCRSE_MAX_RPT_UNITS NUMBER(9,3)
SCBCRSE_CAPP_PREREQ_TEST_IND NOT NULL VARCHAR2(4)
SCBCRSE_DUNT_CODE VARCHAR2(16)
SCBCRSE_NUMBER_OF_UNITS NUMBER(7,2)
SCBCRSE_DATA_ORIGIN VARCHAR2(120)
SCBCRSE_USER_ID VARCHAR2(120)
SCBCRSE_PREREQ_CHK_METHOD_CDE NOT NULL VARCHAR2(4)
SCBCRSE_SURROGATE_ID NUMBER(19)
SCBCRSE_VERSION NUMBER(19)
SCBCRSE_VPDI_CODE VARCHAR2(24)
describe ssbsect
TABLE ssbsect
Name Null? Type
----------------------------------------- -------- ----------------------------
SSBSECT_TERM_CODE NOT NULL VARCHAR2(24)
SSBSECT_CRN NOT NULL VARCHAR2(20)
SSBSECT_PTRM_CODE VARCHAR2(12)
SSBSECT_SUBJ_CODE NOT NULL VARCHAR2(16)
SSBSECT_CRSE_NUMB NOT NULL VARCHAR2(20)
SSBSECT_SEQ_NUMB NOT NULL VARCHAR2(12)
SSBSECT_SSTS_CODE NOT NULL VARCHAR2(4)
SSBSECT_SCHD_CODE NOT NULL VARCHAR2(12)
SSBSECT_CAMP_CODE NOT NULL VARCHAR2(12)
SSBSECT_CRSE_TITLE VARCHAR2(120)
SSBSECT_CREDIT_HRS NUMBER(7,3)
SSBSECT_BILL_HRS NUMBER(7,3)
SSBSECT_GMOD_CODE VARCHAR2(4)
SSBSECT_SAPR_CODE VARCHAR2(8)
SSBSECT_SESS_CODE VARCHAR2(4)
SSBSECT_LINK_IDENT VARCHAR2(8)
SSBSECT_PRNT_IND VARCHAR2(4)
SSBSECT_GRADABLE_IND VARCHAR2(4)
SSBSECT_TUIW_IND VARCHAR2(4)
SSBSECT_REG_ONEUP NOT NULL NUMBER(4)
SSBSECT_PRIOR_ENRL NOT NULL NUMBER(4)
SSBSECT_PROJ_ENRL NOT NULL NUMBER(4)
SSBSECT_MAX_ENRL NOT NULL NUMBER(4)
SSBSECT_ENRL NOT NULL NUMBER(4)
SSBSECT_SEATS_AVAIL NOT NULL NUMBER(4)
SSBSECT_TOT_CREDIT_HRS NUMBER(9,3)
SSBSECT_CENSUS_ENRL NUMBER(4)
SSBSECT_CENSUS_ENRL_DATE NOT NULL DATE
SSBSECT_ACTIVITY_DATE NOT NULL DATE
SSBSECT_PTRM_START_DATE DATE
SSBSECT_PTRM_END_DATE DATE
SSBSECT_PTRM_WEEKS NUMBER(3)
SSBSECT_RESERVED_IND VARCHAR2(4)
SSBSECT_WAIT_CAPACITY NUMBER(4)
SSBSECT_WAIT_COUNT NUMBER(4)
SSBSECT_WAIT_AVAIL NUMBER(4)
SSBSECT_LEC_HR NUMBER(9,3)
SSBSECT_LAB_HR NUMBER(9,3)
SSBSECT_OTH_HR NUMBER(9,3)
SSBSECT_CONT_HR NUMBER(9,3)
SSBSECT_ACCT_CODE VARCHAR2(8)
SSBSECT_ACCL_CODE VARCHAR2(8)
SSBSECT_CENSUS_2_DATE DATE
SSBSECT_ENRL_CUT_OFF_DATE DATE
SSBSECT_ACAD_CUT_OFF_DATE DATE
SSBSECT_DROP_CUT_OFF_DATE DATE
SSBSECT_CENSUS_2_ENRL NUMBER(4)
SSBSECT_VOICE_AVAIL NOT NULL VARCHAR2(4)
SSBSECT_CAPP_PREREQ_TEST_IND NOT NULL VARCHAR2(4)
SSBSECT_GSCH_NAME VARCHAR2(40)
SSBSECT_BEST_OF_COMP NUMBER(3)
SSBSECT_SUBSET_OF_COMP NUMBER(3)
SSBSECT_INSM_CODE VARCHAR2(20)
SSBSECT_REG_FROM_DATE DATE
SSBSECT_REG_TO_DATE DATE
SSBSECT_LEARNER_REGSTART_FDATE DATE
SSBSECT_LEARNER_REGSTART_TDATE DATE
SSBSECT_DUNT_CODE VARCHAR2(16)
SSBSECT_NUMBER_OF_UNITS NUMBER(7,2)
SSBSECT_NUMBER_OF_EXTENSIONS NOT NULL NUMBER(3)
SSBSECT_DATA_ORIGIN VARCHAR2(120)
SSBSECT_USER_ID VARCHAR2(120)
SSBSECT_INTG_CDE VARCHAR2(20)
SSBSECT_PREREQ_CHK_METHOD_CDE VARCHAR2(4)
SSBSECT_SURROGATE_ID NUMBER(19)
SSBSECT_VERSION NUMBER(19)
SSBSECT_VPDI_CODE VARCHAR2(24)
SSBSECT_KEYWORD_INDEX_ID VARCHAR2(120)
describe SCBCRSE_XREF
TABLE SCBCRSE_XREF
Name Null? Type
----------------------------------------- -------- ----------------------------
SSBSECT_TERM_CODE NOT NULL VARCHAR2(24)
SSBSECT_CRN NOT NULL VARCHAR2(20)
SSBSECT_SUBJ_CODE NOT NULL VARCHAR2(16)
SSBSECT_CRSE_NUMB NOT NULL VARCHAR2(20)
SCBCRSE_MAX_EFF_TERM VARCHAR2(24)
【问题讨论】:
-
这不是一个答案,但如果你想
TRUNCATE表而不是删除它,你就不需要重新创建它,也不需要重新创建外键。除此之外,我建议您在每个表格中发布DESCRIBE。 -
对我来说,这听起来像是长时间运行的查询的结果被修改相关表数据的其他线程破坏了。也就是说,FK 不再可用。我会将
CREATE TABLE AS SELECT...解耦为:1)CREATE TABLE x (col1, col2, fk1, fk2, etc.)和 2)INSERT INTO x SELECT ...。 FK 将在插入运行时强制执行,然后您会看到 other 进程崩溃:D -
我已将 describe() 信息添加到表中。 @the-impaler,我会试试看。
标签: sql oracle key primary-key toad