无法在oracle11g中使用外键将数据插入表中

时间:2017-08-02 11:20:06

标签: oracle11g

CREATE TABLE  Client_master (
    Client_no varchar(6) PRIMARY KEY, 
    Name varchar(15) NOT NULL,
    City varchar(15),
    Pincode number(8),
    State varchar(15),
    Bal_due Number(10,2), 
    CHECK(Client_no LIKE 'C%'));

INSERT INTO 
Client_master(Client_no,Name,City,Pincode,State,Bal_due)
VALUES('C00001','Ivan Bayross','Bombay','400054','Maharashtra',15000);

1 row created.

CREATE TABLE  Sales_order(
    Order_no varchar(6) PRIMARY KEY REFERENCES Client_master (Client_no),
    Order_date date, 
    Client_no varchar(6),
    Dely_type char(1) DEFAULT 'f', 
    Billed_yn char(1), 
    Salesman_no varchar(6),
    Dely_date date, 
    Order_status varchar(10), 
    CHECK(Order_no LIKE 'O%'), 
    CHECK(Order_status IN ('inprocess','backorder','cancelled')), 
    CHECK(Dely_date>Order_date));

INSERT INTO Sales_order(Order_no, Order_date, Client_no, Dely_type, Billed_yn, Salesman_no, Dely_date, Order_status) 
VALUES('C19001','12-jan-96','C00001','f','n','S0001','20-jan-96','inprocess');

INSERT INTO
*
ERROR at line 1:
ORA-02291: integrity constraint (SYSTEM.SYS_C007155) violated - parent key not
found

请帮我将数据插入Child表格。 这个SYSTEM.SYS_C007155错误是什么?为什么找不到此错误消息"父键"?

1 个答案:

答案 0 :(得分:0)

parent key not found是因为您的sales_order表中有一个指向client_master的外键,并且没有匹配的键值 - 正如它所说的那样。但这是因为你做了一些奇怪的事情:

Sales_order(Order_no varchar(6) PRIMARY KEY REFERENCES Client_master (Client_no)

您已将order_no作为此表的主键,但使其成为另一个表中client_no的外键。您的插入使用的order_no 'C19001'与先前插入父表的client_no不匹配。

您几乎肯定希望sales_order.client_no成为client_master.client_no的外键,因此您会references...反对 列:

CREATE TABLE  Sales_order(Order_no varchar(6) PRIMARY KEY,
  Order_date date,
  Client_no varchar(6) REFERENCES Client_master (Client_no),
  ...

您还有一个问题,因为您对order_no的检查限制是CHECK(Order_no LIKE 'O%')但是如上所述,您输入的值是'C19001',这与图案。大概你的意思是插入是'O19001';如果不是,那么约束定义不正确。我实际上在11gR2中的主键约束之前达到了该检查约束,所以你可能在发布问题时改变了它。

您可以查看user_constraintsuser_cons_columns视图,了解约束的作用,但如果您name your constraints而不是让Oracle {{3},您会发现它更容易}:

  

指定约束的名称。如果省略此标识符,则Oracle数据库将生成一个名称为SYS_Cn的名称。 Oracle将完整性约束的名称和定义存储在USER_,ALL_和DBA_CONSTRAINTS数据字典视图中(分别在CONSTRAINT_NAME和SEARCH_CONDITION列中)。

例如:

CREATE TABLE  Client_master (
  Client_no varchar(6),
  Name varchar(15) NOT NULL,
  City varchar(15),
  Pincode number(8),
  State varchar(15),
  Bal_due Number(10,2),
  CONSTRAINT Client_master_pk PRIMARY KEY (Client_no),
  CONSTRAINT Client_master_chk_no CHECK(Client_no LIKE 'C%'));

INSERT INTO Client_master(Client_no,Name,City,Pincode,State,Bal_due)
VALUES('C00001','Ivan Bayross','Bombay','400054','Maharashtra',15000);

1 row inserted.

CREATE TABLE Sales_order (
  Order_no varchar(6),
  Order_date date,
  Client_no varchar(6),
  Dely_type char(1) DEFAULT 'f',
  Billed_yn char(1),
  Salesman_no varchar(6),
  Dely_date date,
  Order_status varchar(10),
  CONSTRAINT Sales_order_pk PRIMARY KEY (Order_no),
  CONSTRAINT Sales_order_fk_client FOREIGN KEY (Client_no)
    REFERENCES Client_master (Client_no),
  CONSTRAINT Sales_order_chk_no CHECK (Order_no LIKE 'O%'),
  CONSTRAINT Sales_order_shk_status CHECK
    (Order_status IN ('inprocess','backorder','cancelled')),
  CONSTRAINT Sales_order_chk_dates CHECK(Dely_date>Order_date));

INSERT INTO Sales_order(Order_no, Order_date, Client_no, Dely_type, Billed_yn, Salesman_no, Dely_date, Order_status)
VALUES('O19001','12-jan-96','C00001','f','n','S0001','20-jan-96','inprocess');

1 row inserted.

如果您确实有违规行为,例如使用原始order_no值,您会看到更有用的消息:

INSERT INTO Sales_order(Order_no, Order_date, Client_no, Dely_type, Billed_yn, Salesman_no, Dely_date, Order_status)
VALUES('C19001','12-jan-96','C00001','f','n','S0001','20-jan-96','inprocess');

ORA-02290: check constraint (YOUR_SCHEMA.SALES_ORDER_CHK_NO) violated

这样您就可以更好地了解违反了哪个约束,以及这意味着什么,而无需在数据字典中进行操作。 SALES_ORDER_CHK_NOSYS_C007155更易于解释当然使用对您有意义的名称。

您也可以命名give them default names like SYS_C007155

CREATE TABLE  Client_master (
  Client_no varchar(6) CONSTRAINT Client_master_pk PRIMARY KEY,
...

CREATE TABLE Sales_order (
  Order_no varchar(6) CONSTRAINT Sales_order_pk PRIMARY KEY,
  Order_date date,
  Client_no varchar(6) CONSTRAINT Sales_order_fk_client REFERENCES Client_master (Client_no),
...

但是最后可能会更清晰,更容易维护,所有这些组合在一起。