【问题标题】:SQL Error 02291 - Issues with foreign keys [duplicate]SQL 错误 02291 - 外键问题 [重复]
【发布时间】:2015-11-11 10:35:39
【问题描述】:

我们正在尝试将数据插入到我们的表中,但是我们遇到了错误并且看不到问题所在。这就是我们得到的 -

插入项目(Manifest_barcode,Trip_ID,Item_weight,Pickup_customer,Delivery_customer,Category)值(159601450,73495,2156,166,184,'A') 错误报告 - SQL 错误:ORA-02291:违反完整性约束 (HR.SYS_C009055) - 未找到父键 02291. 00000 - “违反完整性约束 (%s.%s) - 未找到父键”

我们检查了表格的创建顺序,据我们所知,一切都在正确的位置。所有外键似乎也是正确的。

这就是我们删除/创建表格的方式 -

DROP TABLE Item;
DROP TABLE Trip;
DROP TABLE Vehicle;
DROP TABLE Vehicle_Type;
DROP TABLE Employee;
DROP TABLE Customer;
DROP TABLE Category;

CREATE TABLE Category(
    Category VARCHAR2(100) NOT NULL,
    Description VARCHAR2(100) NOT NULL,
    Requirements VARCHAR2(100),

    PRIMARY KEY(Category)
);

CREATE TABLE Customer(
  Reference INT NOT NULL,
  Name VARCHAR2(100) NOT NULL,
  Address VARCHAR2(100) NOT NULL,
  Town VARCHAR2(100) NOT NULL,
  Post_code VARCHAR2(8) NOT NULL,
  Telephone INT NOT NULL,
  Contact_first_name VARCHAR2(100) NOT NULL,
  Contact_last_name VARCHAR2(100) NOT NULL,
  Email VARCHAR2(100) NOT NULL,

  PRIMARY KEY(Reference)
);

CREATE TABLE Employee(
  Employee_no INT NOT NULL,
  First_name VARCHAR2(100) NOT NULL,
  Last_name VARCHAR2(100) NOT NULL,
  NI_No VARCHAR2(100) NOT NULL,
  Telephone VARCHAR2(100) NOT NULL,
  Mobile VARCHAR2(100) NOT NULL,
  Hazardous_goods VARCHAR2(100) NOT NULL,

  PRIMARY KEY(Employee_no)
);

CREATE TABLE Vehicle_Type(
    Vehicle_Type_ID VARCHAR2(100) NOT NULL,
    Model VARCHAR2(100) NOT NULL,
    Make VARCHAR2(100) NOT NULL,

    PRIMARY KEY(Vehicle_Type_ID)
);

CREATE TABLE Vehicle(
  Registration VARCHAR2(100) NOT NULL,
  Vehicle_Type_ID VARCHAR2(100) NOT NULL,
  GVW VARCHAR2(100) NOT NULL,
  Vehicle_Year INT NOT NULL,
  Body VARCHAR2(100),

  PRIMARY KEY(Registration),
   FOREIGN KEY(Vehicle_Type_ID) REFERENCES Vehicle_Type(Vehicle_Type_ID)
);

CREATE TABLE Trip(
    Trip_ID INT NOT NULL,
    Departure_date VARCHAR2(100) NOT NULL,
    Return_date VARCHAR2(100) NOT NULL,
    Employee_no INT NOT NULL,
    Vehicle_registration VARCHAR2(100) NOT NULL,

    PRIMARY KEY(Trip_ID),
    FOREIGN KEY(Employee_no) REFERENCES Employee(Employee_no)
);

CREATE TABLE Item(
    Manifest_barcode VARCHAR2(100) NOT NULL,
    Trip_ID INT NOT NULL,
    Item_weight INT NOT NULL,
    Pickup_customer INT NOT NULL,
    Delivery_customer INT NOT NULL,
    Category VARCHAR2(100) NOT NULL,

    PRIMARY KEY(Manifest_barcode),
    FOREIGN KEY(Trip_ID) REFERENCES Trip(Trip_ID),
    FOREIGN KEY(Category) REFERENCES Category(Category)
);

这是插入项目的方式 -

INSERT INTO Customer (Name,Reference,Address,Town,Post_code,Telephone,Contact_first_name,Contact_last_name,Email) VALUES
('Calash Ltd.',1,'88 Rinkomania Lane','Cardigan','SA55 8BA',11671595763,'Cameron','Dunnico','c.dunnico@calash.co.uk');

INSERT INTO Employee (Employee_no,First_name,Last_name,NI_No,Telephone,Mobile,Hazardous_goods) VALUES
(0045619,'Eamon','O''Looney','JJ 56 53 26 B','1656727840','76599770175','N');

INSERT INTO Vehicle_Type (Vehicle_Type_ID,Model,Make) VALUES
(1,'RIEVER','ALBION');

INSERT INTO Vehicle(Registration,Vehicle_Type_ID,GVW,Vehicle_Year,Body) VALUES
('4585 AW',1,20321,1963,'');

INSERT INTO Category (Category, Description, Requirements) VALUES
('A','Normal','');

INSERT INTO Trip(Trip_ID,Departure_date,Return_date,Employee_no,Vehicle_registration) VALUES
(72943,'40910','40914',0028539,'BR58BXE');

INSERT INTO Item(Manifest_barcode,Trip_ID,Item_weight,Pickup_customer,Delivery_customer,Category) VALUES
(541769754,73421,3629,44,145,'A');

大家有什么建议吗?

【问题讨论】:

  • HR.SYS_C009055 是哪个 FK?
  • 您要么没有 ID 为 73495 的 TRIP 记录,要么没有带有“A”的 CATEGORY 记录。如果您已命名约束,则更容易分辨出哪个约束,但您可以检查数据字典(all_cons_columns 等)以查看哪个约束具有该系统生成的名称。您没有显示正在填充的其他表,因此我们不知道存在哪些数据。
  • @AlexPoole 我已经编辑了问题并添加了其余数据。
  • @jarlh 如何检查外键 HR.SYS_C009055 是什么?
  • 您的示例插入中的两个 TRIP_ID 值不匹配。这些是您创建的唯一行吗?

标签: sql oracle foreign-keys ora-02291


【解决方案1】:

您的完整插入脚本在 item 表中有 13 次插入,trip_id 73495。您的错误是从第一个抛出的:

INSERT INTO Item(Manifest_barcode,Trip_ID,Item_weight,Pickup_customer,Delivery_customer,Category)
VALUES (159601450,73495,2156,166,184,'A');

您的脚本没有trip 表提供匹配的插入。两边都有 ID:

INSERT INTO Trip(Trip_ID,Departure_date,Return_date,Employee_no,Vehicle_registration)
VALUES (73494,'40994','40995',0077517,'PY11 OAA');
INSERT INTO Trip(Trip_ID,Departure_date,Return_date,Employee_no,Vehicle_registration)
VALUES (73496,'40994','41000',0083413,'PY58 UHF');

但是 ID 73495 没有。

在该脚本中搜索 73495 仅匹配这 13 个 item 插入,以及包含它的 617349505 的 manifest_barcode 的后续项目。但仅此而已。

没有匹配的行程,这是异常告诉你的。

【讨论】:

    【解决方案2】:

    您好,请检查以下内容

    您已将这一行插入到employee 表中且employee_no=0045619

    INSERT INTO Employee (Employee_no,First_name,Last_name,NI_No,Telephone,Mobile,Hazardous_goods) VALUES
    (0045619,'Eamon','O''Looney','JJ 56 53 26 B','1656727840','76599770175','N');
    

    trip 是引用员工表的表

    INSERT INTO Trip(Trip_ID,Departure_date,Return_date,Employee_no,Vehicle_registration) VALUES
    (72943,'40910','40914',0028539,'BR58BXE');
    

    在此插入语句中,您插入了一个带有employee_no=0028539 的行与employee 表中可用的employee_no(0045619) 不匹配。 请更正值并尝试在员工表中插入相同的员工编号

    ---------已编辑----

    检查项目(73421)中的tripid是否在行程表中可用?

    【讨论】:

    • 匹配的数据多得多。问题中插入的数据只是其中的一个示例。
    • 错误来自item 插入,这意味着它是它的两个没有父级的 FK 之一;不是员工/差旅关系。处理部分数据并没有帮助 *8-)
    • @user3746428 能否检查一下行程表中是否存在item表中的trip_id值?
    • @AlexPoole 我尝试了问题中的给定陈述,因为我收到了通知他的错误
    • 我明白这一点,但 OP 已经评论说“问题中的插入只是示例,还有其他匹配”。这当然没有帮助......
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多