当前位置: 首页 > 知识库问答 >
问题:

ORA-02291:完整性约束;未找到父密钥错误

李建中
2023-03-14

我尝试按如下方式创建父表和子表:

CREATE SEQUENCE ProcessLogId;

CREATE TABLE ProcessLog
(
ProcessLogId NUMBER DEFAULT ProcessLogId.NEXTVAL NOT NULL ,
ProcessName VARCHAR(20),
ProcessStatus VARCHAR(20),
StartTime DATE ,
EndTime DATE,
CreatedOn DATE DEFAULT (SYSDATE) NOT NULL,
CreatedBy VARCHAR(45) DEFAULT USER NOT NULL,
CONSTRAINT PK_ProcessLog PRIMARY KEY(ProcessLogId)
);

CREATE SEQUENCE SourceLogId;

CREATE TABLE SourceLog
(
SourceLogId    NUMBER DEFAULT SourceLogId.NEXTVAL NOT NULL ,
ProcessLogId    NUMBER NULL,
SourceName    VARCHAR(512) NOT NULL,
TotalRowCount    INT,
Status    VARCHAR(20),
StartTime    DATE,
EndTime    DATE
CONSTRAINT PK_SourceLogId PRIMARY KEY(SourceLogId),
CONSTRAINT CK_SourceLog_Status CHECK (Status='S' OR Status='F' OR Status='I'),
CONSTRAINT FK_SourceLog_ProcessLog FOREIGN KEY (ProcessLogId) REFERENCES ProcessLog(ProcessLogId)
);

我创建了两个程序来插入记录:

CREATE OR REPLACE PROCEDURE GetProcessLogId
(
ProcessName IN VARCHAR,ProcessLogId OUT INT)
AS
BEGIN
    INSERT INTO PROCESSLOG
           (ProcessName
           ,ProcessStatus
           ,StartTime)               

    VALUES(ProcessName
           ,'I'
           ,SYSDATE)
    RETURNING ProcessLogId INTO ProcessLogId;

END;

CREATE OR REPLACE PROCEDURE GetSourceLogId
(ProcessLogId IN NUMBER,SourceName IN VARCHAR,SourceLogId OUT NUMBER)
AS
BEGIN   

    INSERT INTO SourceLog
            (ProcessLogId
            ,SourceName
            ,Status
            ,StartTime)        
    VALUES  (ProcessLogId
            ,SourceName
            ,'I'
            ,SYSDATE)
    RETURNING SourceLogId INTO SourceLogId;
END; 

我已经创建了SSIS包来html" target="_blank">调用这两个过程。父ProcessLog记录插入成功。但是对于子表过程,我得到以下错误:

“[Execute SQL Task]错误:执行查询”BEGIN GetSourceLogId(?,?输出);终止失败,出现以下错误:“违反了ORA-02291:完整性约束(PATIENTMDR.FK_SOURCELOG_PROCESSLOG)-未找到父项ORA-06512:位于“PATIENTMDR.GETSOURCELOGID”,第6行ORA-06512:在第1行。可能的失败原因:查询问题、“ResultSet”属性设置不正确、参数设置不正确或连接建立不正确

我的SSIS包包含两个ExecuteSQL任务。在第一个任务中,我调用了GetProcessLogId过程:

BEGIN
GetProcessLogId(?,?output);
end;

在第二个任务中,我调用了GetSourceLogId过程:

BEGIN
GetSourceLogId(?,?,?output);
end;

我有四个变量,var_processlogidvar_processnamevar_sourcelogidvar_sourcename

我已经给前两个赋值,var\u processname='Process1'var\u sourcename='Source1';我在参数映射部分指定了适当的变量。

我已经检查了所有的约束条件。我没能解决这个问题。我做错了什么?

共有1个答案

锺离赤岩
2023-03-14

您必须将错误的ProcessLogId传递给GetSourceLogId(顺便说一句,它的名称很奇怪,此过程主要插入一行,并应相应地命名)。由于您没有将调用发布到GetSourceLogId,我无法判断您哪里出错了。

尝试删除FK\u SourceLog\u ProcessLogconstant。那么你的插入应该成功了。然后检查SourceLog中的内容。毫无疑问,您将在那里找到ProcessLogIds,它们在ProcessLog中没有对应关系。那么事情就应该清楚了。

 类似资料:
  • 所以这里是我的数据库: 插入表格: 批次表不断出现的错误是:ORA-02290:违反了检查约束(EJAY.batches\u DATE\u CHK) 学生表出现的错误是:ORA-02291:违反完整性约束-未找到父键 我感到困惑的是,它只显示在表格中的一些行。教职员工和课程都很好,只有这两个。如果答案很明显,我道歉,我是初学者。请帮帮忙

  • 当我做插入它给我这个错误: ORA-02291:违反完整性约束(H00300581.FK_类)-未找到父密钥 对于注册表中的所有插入,都会发生此错误。我需要帮忙,请帮我修一下。 是否来自表中的外键?可能是因为我什么都试过了,但都没用。 创建表 创建序列 培训师数据 类数据 成员数据 注册资料

  • 当我创建表时,我将作为主键,将作为外键从同一个表中创建,作为dep表中的外键,当我想插入显示的值时,现在我感到困惑。 该表包含以下内容: 我第一次使用以下命令行: 然后我尝试不使用,如下所示:

  • 我在向vod_film表中插入值时遇到问题。各表如下: 当我运行以下代码时: 我有这个错误返回: ORA-02291:完整性约束(OPS$P2417335.VOD_FILM_CLASS_FK)被侵犯-未找到父密钥 我不确定为什么会返回此错误,因为外键引用了vod_分类中的现有字段。在插入数据时,所有表格都已按我认为正确的顺序添加。 任何关于我为什么会收到这个错误的帮助都将不胜感激,或者如果我需要提

  • 我试图为和创建会话,这两个表都与相同的外键关联到登录表-但是当我为创建种子时,我得到了错误,在我的另一个问题在这个链接中,我没有以最好的方式解释,但得到了一些关于使用(党-角色-关系模型)和这段代码下面他更多的想法有关已解决的问题链接 创建表和主键 创建表和主键 创建表以及主键和外键 使用表为管理员创建会话的过程: 使用表为用户创建会话的过程: 创建管理会话时,我收到一个错误 我做错了什么?

  • 因此,我正在用Oracle编写一些代码,并建立了以下表格: 下载表连接用户和产品表,其中包含外键user_id和product_id。我正试图通过以下代码将数据插入下载表: Oracle然后给我以下错误: 错误报告-ORA-02291:完整性约束(BC29369.DOWNLOADS_FK2)违反-未找到父密钥。 我很清楚为什么我不应该把它作为我的首要关系。有人知道如何解决这个问题吗?提前谢谢你!