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

违反完整性约束(SYSTEM.FK_FACILITY)-未找到父密钥

郑俊彦
2023-03-14

我得到了“完整性约束(SYSTEM。FK_FACILITY)违反了父密钥未找到”错误,尽管主键在上一个表中已经明确定义。

CREATE TABLE Facility (
  facNo   CHAR(11)    NOT NULL,
  facName VARCHAR(30) NOT NULL,
  CONSTRAINT FacilityPK PRIMARY KEY (facNo)
);
INSERT INTO Facility (facNo, facName) VALUES ('F100', 'Football stadium');
INSERT INTO Facility (facNo, facName) VALUES ('F101', 'Basketball arena');

CREATE TABLE Customer (
  custNo   CHAR(8)     NOT NULL,
  custName VARCHAR(30) NOT NULL,
  address  VARCHAR(50) NOT NULL,
  internal CHAR(10)     NOT NULL,
  city     VARCHAR(30) NOT NULL,
  zip      VARCHAR(10) NOT NULL,
  state1    VARCHAR(2)  NOT NULL,
  contact  VARCHAR(50) NOT NULL,
  phone    VARCHAR(30) NOT NULL,
  CONSTRAINT CustomerPk PRIMARY KEY (custNo)
);


INSERT INTO Customer (custNo, custName, address, internal, city, zip, state1, contact, phone) VALUES
  ('C100', 'Football', 'Box 352200', 'True', 'Boulder', '80309', 'CO', 'Mary Manager', '6857100');
INSERT INTO Customer (custNo, custName, address, internal, city, zip, state1, contact, phone) VALUES
  ('C101', 'Men''s Basketball', 'Box 352400', 'TRUE' , 'Boulder', '80309', 'CO', 'Sally Supervisor', '5431700');


CREATE TABLE EventReq (
  evntNo      CHAR(8)       NOT NULL,
  custNo      CHAR(8)       NOT NULL,
  facNo       CHAR(8)       NOT NULL,
  dateHeld    DATE          NOT NULL,
  dateReq     DATE          NOT NULL,
  dateAuth    DATE,
  status      CHAR(20)      NOT NULL,
  estCost     DECIMAL(8, 2) NOT NULL,
  estAudience INTEGER       NOT NULL,
  budNo       CHAR(30),
  CONSTRAINT EventReqtPK PRIMARY KEY (evntNo),
  CONSTRAINT FK_Facility FOREIGN KEY (facNo) REFERENCES Facility (facNo),
  CONSTRAINT FK_Customer FOREIGN KEY (custNo) REFERENCES Customer (custNo)

);

INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Approved', 5000.00, 80000, 'B1000');

我的确切错误是

INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Approved', 5000.00, 80000, 'B1000')
Error report -
ORA-02291: integrity constraint (SYSTEM.FK_FACILITY) violated - parent key not found

我只想将值添加到表中,但我无法这样做。。。如果有人能帮我,那就太好了!

共有1个答案

林富
2023-03-14

CHAR是一个糟糕的选择,除非您知道所有值都是固定长度的。为什么?因为Oracle right使用空格填充这些值,最多可达最大列长度。

这就是你所做的:

SQL> desc facility;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FACNO                                     NOT NULL CHAR(11)           --> 11 characters
 FACNAME                                   NOT NULL VARCHAR2(30)

SQL> select facno, length(facno) lenfac, 'x' || facno ||'x' xfac from facility;

FACNO           LENFAC XFAC
----------- ---------- -------------
F100                11 xF100       x
F101                11 xF101       x      
                            -------
                            1234567 spaces
SQL>

看见

  • 列长度=11
  • 您存储的值是F100
  • 它存储为F1007个空格,总共11个字符

在插入eventreq表时,这不会产生问题,但是-您说过它在facno列中接受11个字符:

SQL> desc eventreq
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EVNTNO                                    NOT NULL CHAR(8)
 CUSTNO                                    NOT NULL CHAR(8)
 FACNO                                     NOT NULL CHAR(8)         --> 8 characters
 DATEHELD                                  NOT NULL DATE
 DATEREQ                                   NOT NULL DATE
 DATEAUTH                                           DATE
 STATUS                                    NOT NULL CHAR(20)
 ESTCOST                                   NOT NULL NUMBER(8,2)
 ESTAUDIENCE                               NOT NULL NUMBER(38)
 BUDNO                                              CHAR(30)

SQL>

这意味着-当您在eventreq表中插入一行时,facno=F100用空格右键填充,最大列长为8个字符(即F1004个空格)。

比较:

facility - facno char(11)
eventreq - facno char(8)

F100右键填充为8个字符不同于F100右键填充为11个字符,这就是为什么Oracle说它找不到匹配的父密钥。

怎么办?

  • 缩短facno表中的列为8个字符
    • 或者将eventreq中的那一栏放大到11个字符

    例如,如果两列都是CHAR(8)

    SQL> desc facility
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     FACNO                                     NOT NULL CHAR(8)
     FACNAME                                   NOT NULL VARCHAR2(30)
    
    SQL> select * From facility;
    
    FACNO    FACNAME
    -------- ------------------------------
    F100     Football stadium
    
    SQL> desc eventreq;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     EVNTNO                                    NOT NULL CHAR(8)
     CUSTNO                                    NOT NULL CHAR(8)
     FACNO                                     NOT NULL CHAR(8)
     DATEHELD                                  NOT NULL DATE
     DATEREQ                                   NOT NULL DATE
     DATEAUTH                                           DATE
     STATUS                                    NOT NULL CHAR(20)
     ESTCOST                                   NOT NULL NUMBER(8,2)
     ESTAUDIENCE                               NOT NULL NUMBER(38)
     BUDNO                                              CHAR(30)
    
    SQL> INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
      2  VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Appr
    oved', 5000.00, 80000, 'B1000');
    
    1 row created.
    
    SQL>
    

    它起作用了。

    最后,一个巨大的错误:

    系统FK_设施

    除了数据库管理之外,不要使用SYSTEM(也不要使用SYS)用户。它们不应该被用于像你这样的目的。

 类似资料:
  • 将实体插入数据库时遇到问题。我正在使用HibernateJPA。 我有表提醒和提醒行动和每个提醒将保持当前状态的提醒行动(即。OneToOne)和交易结束每个提醒将有许多提醒操作(具有不同的状态)。 在saveOrUpdate期间,hibernate从DB获取提醒和提醒操作的顺序 但是在flush()期间,Hibernate尝试首先插入ReminderAction,并且由于ReminderActi

  • SQL数据库代码: 大家好!我做了一系列的桌子,我想我做的每件事都是正确的。除了位置表之外,我在所有表上输入了输入值,没有任何问题。 这就是给我的错误。 第1行错误:ORA-02291:违反完整性约束(ASSIGNMENT.FK_TENANT)-未找到父密钥。 任何帮助和提示将不胜感激。谢谢! 固定的

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

  • 问题内容: 嗨,我正在Oracle SQL开发人员中开发数据库,​​试图从另一个表访问foriegn键。我目前正在使用以下CREATE语句创建的ItemOrdered表 如您所见,我具有以下前键Ords和BeltID。 现在,当我尝试运行以下语句时 它给了我以下错误 违反-找不到父密钥02291。00000-“违反完整性约束(%s。%s)-找不到父密钥” 如果需要,我已经提供了Ords CREAT

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

  • 有人能帮我吗?我已经创建了我所有的表和insert语句,但是我得到了这个错误。 这是我试图将数据插入的表: 这是我的插入声明: 错误: “违反了完整性约束(%s.%s)-未找到父项”(SQL Developer) 完整性约束(MS166.FK_SPECIES_ID)被侵犯-未找到父密钥(SQLPlus) 先谢谢你。